<
データの前に新しい行を追加するにはどうすればいいでしょうか?
私の現在の日付は次のようになります
<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に選択して置換するように指示しますstring[テキスト]- sedはこのフォーマットを使用します
/selectText/ReplaceText/
--> 例、/<//
これはシンボルを削除します<
、最初のものだけ<
- すべてを選択するには、
<
引数をg
の末尾に使用します/select/replace/g
。つまり、見つかったものすべてを置き換えます。例: replace all<
\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