
以下の例のようなテキスト ファイルがあります。
挿入したい
<string>insert-me</string>
指定された行に。
どうすればいいでしょうか? これに似たバリエーションを試してみました:
sed "/s/<key>first</key>/\n <array>/\n/test/g" test.txt
そして、「代替コマンドのフラグが不正です」というエラーが繰り返し発生します。
ありがとう
サンプルテキストファイル:
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>
答え1
ここにはいくつかの問題があります(正規表現ツールで構造化データを解析しようとする一般的な問題以外にも)
パターン(または置換)にスラッシュが含まれている場合は、sedコマンドに別の区切り文字を使用するか、スラッシュをエスケープする必要があります。
sedは(通常)行指向なので、パターンスペースに追加の行を引き込まない限り、行の境界を越えて一致させることはできません。
N
特定の量の空白を一致させることで、全体がさらに脆弱になります
たとえば、次のようにすることができます。
sed '/<key>second<\/key>/ {N; s/\n[[:blank:]]*<array>/&\n\tinsert-me/;}' test.txt
または(より自然に)1つのではなくs代用する
sed -e '/<key>second<\/key>/ {N; /<array>/ a\\tinsert-me' -e ';}' test.txt
<record>
<key>first</key>
<array>
--I want to insert the line here--
<string>hello</string>
<string>world</string>
</array>
</record>
<record>
<key>second</key>
<array>
insert-me
<string>its</string>
<string>me</string>
<string>again</string>
<string>hello</string>
<string>world</string>
<string>again</string>
</array>
</record>