[英]Using sed with a newline in a regex
我用這個把頭撞在牆上。 如何在包含換行符的文本上用sed
進行正則表達式替換?
我需要替換下面顯示的“版本” XML元素的值。 有多個版本元素,因此我想替換“名稱”元素之后的版本元素。
<name>MyName</name>
<version>old</version>
這是我的命令:
sed -i -E "s@(\s*<name>$NAME</name>\n\s*<version>)$VERSION_OLD(</version>)@\1$VERSION_NEW\2@g" $myfile.txt
現在,據我所知,有一種方法可以使sed
與換行符一起工作,但我無法弄清楚。 我已經在腳本中使用了sed,因此理想情況下,我希望重用它而不是說perl
。
看到name
元素時,將需要使用N
命令讀取下一行:
文件:
<bar>MyName</bar>
<version>old</version>
<name>MyName</name>
<version>old</version>
<foo>MyName</foo>
<version>old</version>
使用GNU sed:
sed '/<name>/{N;s/old/newer/}' file
輸出:
<bar>MyName</bar>
<version>old</version>
<name>MyName</name>
<version>new</version>
<foo>MyName</foo>
<version>old</version>
如果您使用的是GNU sed,則可以使用其擴展的尋址語法:
sed '/<name>/,+1{/<version>/s/old/newer/}' file
對此進行細分,它說:對於與<name>
匹配的行以及下一行( +1
),則如果該行與<version>
匹配,則將old
替換為newer
。
我在這里假設您的文件已生成,並且始終將name
和version
元素分別放在一行並相鄰。 如果您需要處理更多自由格式的XML,那么您應該真正考慮使用基於XPath的工具而不是sed。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.