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

相关内容