<
データの前に新しい行を追加するには?
私の現在の日付は次のとおりです。
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0" <VALUE MAGID="2" MAGNAME="Heal" TYPE="4" <VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7" <VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7" <VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
出力は
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0"
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4"
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7"
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7"
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
答え1
sed
テキストパターンを置き換えるには、「s」コマンドを使用できます。
sed 's/foo/bar/g'
のすべての発生をfoo
置き換えますbar
。
特に、各前に改行文字を追加するには、<
次のようにします。
echo '<value ... <value ...' | sed 's/</\n</g'
最初に改行文字を追加したくない場合は、次のようにします。
echo '<value ... <value ...' | sed 's/\(.\)</\1\n</g'
答え2
sed 's/</\n&/g'
s
引数は sed に選択して置換するよう指示します。S文字列[テキスト]- sedはこの形式を使用します
/selectText/ReplaceText/
- >たとえば、/<//
これはシンボルを削除し、<
最初のシンボルのみを削除します。<
- すべてを選択するには、endに引数を
<
使用します。これは、見つかったすべての項目を置き換えることを意味します。たとえば、すべて置換g
/select/replace/g
<
\n
パラメータの追加新しいチーム\
バックスラッシュを使用して作成する必要があります。&
引数はsedにすべてをコピーして貼り付けるように指示します。後ろにこの場合、選択したもの<
値...
答え3
GNUがある場合は、他の回答で提案されているとおりに実行できますsed
。
sed 's/</\n</g' file
ただし、macOSや他のBSDシステムなどのGNUがない場合は、代替テキストにエスケープシーケンスのsed
代わりにリテラル改行文字を使用する必要があります。\n
sed 's/</\
</g' file
これは少し見苦しく見えますが、標準は代替テキストの「リテラル文字」以外のものをsed
認識しません。\n
n
y///
すべてを改行するコマンドを使用して、<
見苦しい構文を変更できます(ここでは\n
はい「改行文字」として認識される)<
文字を再挿入します。
sed -e 'y/</\n/' -e 's/\n/&</g' file
最初の空の結果行をフィルタリングするには、以下をパイプしますtail -n +2
。
$ sed -e 'y/</\n/' -e 's/\n/&</g' file | tail -n +2
<VALUE MAGID="1" MAGNAME="Fireball" TYPE="0"
<VALUE MAGID="2" MAGNAME="Heal" TYPE="4"
<VALUE MAGID="3" MAGNAME="WeaponAccuracy" TYPE="7"
<VALUE MAGID="4" MAGNAME="WeaponGuidance" TYPE="7"
<VALUE MAGID="5" MAGNAME="GreaterFireball" TYPE="0"
...しかし、理想的には、ラインベースのツールを使用して解析のためにフォーマットを再指定する前に、元のXMLファイルとxmlstarlet
同様のXMLパーサを使用することをお勧めします。xq