我要尋找一個解決辦法,讓我來搜索會看文件,找到諸如圖案的Linux服務器上的文本文件替換:找到兩條線,並與一個
Text 123
Blue Green
然後替換它與一行,每次它發現它在一個文件中...
Order Blue Green
我不知道什麼是最簡單的方法來解決這個問題。我看過很多使用SED的指南,但僅用於查找一行並替換它。
我要尋找一個解決辦法,讓我來搜索會看文件,找到諸如圖案的Linux服務器上的文本文件替換:找到兩條線,並與一個
Text 123
Blue Green
然後替換它與一行,每次它發現它在一個文件中...
Order Blue Green
我不知道什麼是最簡單的方法來解決這個問題。我看過很多使用SED的指南,但僅用於查找一行並替換它。
你問sed,這裏是sed的答案。
但是,讓我提一下,雖然sed對於這種練習很有趣,但你可能應該選擇其他的東西,更靈活,更容易學習;例如perl。
/Text 123/
:a
N
s/Text 123\nText 123/Text 123/p;
ta;
s///
代碼:
sed "/Text 123/{:a;N;s/Text 123\nText 123/Text 123/p;ta;s/Text 123\nBlue Green/Order Blue Green/}"
測試輸入:
Text 123
Do not replace
Lala
Text 123
Blue Green
lulu
Text 123
Do not replace either
Text 123
Text 123
Blue Green
preceding should be replaced
輸出:
Text 123
Do not replace
Lala
Order Blue Green
lulu
Text 123
Do not replace either
Text 123
Order Blue Green
preceding should be replaced
平臺:Windows和GNU的sed版本4.2.1
注: 在該平臺sed的行允許使用的環境變量的兩個文本片段,你可能想要做:
sed "/%EnvVar2%/{:a;N;s/%EnvVar2%\n%EnvVar2%/%EnvVar2%/p;ta;s/%EnvVar2%\n%EnvVar%/Order %EnvVar%/}"
PLATFORM2:
仍然是Windows
使用bash GNU的bash,版本3.1.17(1)-release(i686的-PC-MSYS)
GNU版本的sed 4.2.1(相同)
在這個平臺上,變量可以例如使用這樣的:
sed "/${EnvVar2}/{:a;N;s/${EnvVar2}\n${EnvVar2}/${EnvVar2}/p;ta;s/${EnvVar2}\n${EnvVar}/Order ${EnvVar}/}"
在這個平臺上它使用"..."
爲了能夠使用變量,
它不與'...'
工作是非常重要的。
正如@edMorton所暗示的,在所有平臺上都要小心,然而試圖用看起來像使用變量的文本替換(使用變量)。例如。與「文本$ 123」在bash中。在這種情況下,如果不使用變量,而是試圖替換看起來像變量的文本,則使用'...'
而不是"..."
即可。
sed用於簡單替換個別行,即所有。如果你發現自己試圖使用除s,g和p之外的結構(帶-n),那麼你就錯了,因爲所有其他sed構造在20世紀70年代中期awk被髮明時變得過時了。
你的問題是不是做對個別線路替代,它是在一個多行記錄,這樣做與GNU AWK多焦RS是:
$ awk -v RS='^$' -v ORS= '{gsub(/Text 123\nBlue Green/,"Order Blue Green")}1' file
Order Blue Green
但也有依賴於其他幾個方法你真正的需求。
https://stackoverflow.com/questions/8164604/replacing-multiple-line-pattern-in-sed – refi64