
我有一個類似於下面範例的文字檔。
我想插入
<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>