如何使用 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

或(更自然地)使用A掛起而不是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>

相關內容