簡體   English   中英

在正則表達式中將sed與換行符一起使用

[英]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

我在這里假設您的文件已生成,並且始終將nameversion元素分別放在一行並相鄰。 如果您需要處理更多自由格式的XML,那么您應該真正考慮使用基於XPath的工具而不是sed。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM