我有一个类似于下面示例的文本文件。
我想插入
<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
或者(更自然地)使用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>