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

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

<データの前に新しい行を追加するには?

私の現在の日付は次のとおりです。

<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認識しません。\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

関連情報