テキストフィールドの後に行を追加する

テキストフィールドの後に行を追加する

<データの前に新しい行を追加するにはどうすればいいでしょうか?

私の現在の日付は次のようになります

<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認識されません。\nn

醜い構文を回避するには、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

関連情報