sed+regex を使用してテキスト ファイルの指定された場所に行を挿入するにはどうすればよいですか?

sed+regex を使用してテキスト ファイルの指定された場所に行を挿入するにはどうすればよいですか?

以下の例のようなテキスト ファイルがあります。

挿入したい

<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

ここにはいくつかの問題があります(正規表現ツールで構造化データを解析しようとする一般的な問題以外にも)

  1. パターン(または置換)にスラッシュが含まれている場合は、sedコマンドに別の区切り文字を使用するか、スラッシュをエスケープする必要があります。

  2. sedは(通常)行指向なので、パターンスペースに追加の行を引き込まない限り、行の境界を越えて一致させることはできません。N

  3. 特定の量の空白を一致させることで、全体がさらに脆弱になります

たとえば、次のようにすることができます。

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>

関連情報