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

または(もっと自然に)使用代わりに歩く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>

おすすめ記事