2017-06-14 61 views
0

我要尋找一個解決辦法,讓我來搜索會看文件,找到諸如圖案的Linux服務器上的文本文件替換:找到兩條線,並與一個

Text 123 
Blue Green 

然後替換它與一行,每次它發現它在一個文件中...

Order Blue Green 

我不知道什麼是最簡單的方法來解決這個問題。我看過很多使用SED的指南,但僅用於查找一行並替換它。

+0

https://stackoverflow.com/questions/8164604/replacing-multiple-line-pattern-in-sed – refi64

回答

1

你問sed,這裏是sed的答案。
但是,讓我提一下,雖然sed對於這種練習很有趣,但你可能應該選擇其他的東西,更靈活,更容易學習;例如perl。

  • 找一線/Text 123/
  • 時發現啓動循環:a
    • CONCAT下一行N
    • 單副本替換搜索文本的雙胞胎和打印
      s/Text 123\nText 123/Text 123/p;
    • 環而代替ta;
  • 嘗試更換s///
  • 依靠CONCAT正在打印不變,如果更換不觸發

代碼:

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中。在這種情況下,如果不使用變量,而是試圖替換看起來像變量的文本,則使用'...'而不是"..."即可。

+0

除非你因爲某些原因需要雙引號(例如讓一個變量擴展),否則總是將腳本括在單引號中如果在OP想要替換的2行塊之前在行上出現「文本123」,那麼這將失敗。這根本不是sed的工作。 –

+0

@EdMorton你有沒有測試你的失敗陳述?我測試了我的腳本,它可以在發生替換前後使用具有「文本123」的輸入。 (在windows上,使用sed GNU sed version 4.2.1)。 – Yunnosch

+0

@EdMorton你是否認爲腳本在''...''有些情況下會失敗,''...''?你能舉一個這樣的測試用例嗎? – Yunnosch

0

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 

但也有依賴於其他幾個方法你真正的需求。