2017-03-22 78 views
0

我有一個文本文件如下SED/awk中如何搜索並替換文本行不包括文本塊

PARAMETER=VALUE 
PARAMETER1=VALUE 

[START] 
PARAMETER=VALUE 

[END] 

我想用sed搜索PARAMETER與精確匹配和替換整條生產線新的文字。但我想排除同一PARAMETER如果[START][END]

之間你能夠幫助構建sedawk命令

+0

可以讓我們知道什麼是你從末試過嗎? –

回答

0

使用SED:

sed '/^\[START\]/,/^\[END\]/!s/^PARAMETER=.*/replacement/' 

說明:

  • /^\[START\]/,/^\[END\]/:匹配所有章節開始與[START][END]
  • !結束:忽略該地址,即所有線路相匹配的部分外(s)
  • s/^PARAMETER=.*/replacement/:取代每一個林Ë與PARAMETER=

實例開始:

$ cat input.txt 
PARAMETER=VALUE 
PARAMETER1=VALUE 

[START] 
PARAMETER=VALUE 

[END] 
$ sed '/^\[START\]/,/^\[END\]/!s/^PARAMETER=.*/replacement/' input.txt 
replacement 
PARAMETER1=VALUE 

[START] 
PARAMETER=VALUE 

[END] 
$ 
1

在awk中使用f滯後:

$ awk ' 
/^PARAMETER/ && f!=1 { $0="THE REPLACEMENT" } # replace when flag not raised 
/\[START\]/ { f=1 }        # raise flag at marker 
/\[END\]/ { f=0 }        # flip flag at the other 
1' file          # output 
THE REPLACEMENT 
THE REPLACEMENT 

[START] 
PARAMETER=VALUE 

[END] 

編輯增加了一行 -

$ awk '/^PARAMETER/&&f!=1{$0="THE REPLACEMENT"}/\[START\]/{f=1}/\[END\]/{f=0}1' file 
+0

對不起,如果這是一個愚蠢的問題..但我怎麼會重新寫在一條線?我嘗試在SSH命令下執行此操作,並且出現以下錯誤 – Prashant

+0

用法:awk [POSIX或GNU風格選項] -f progfile [ - ]文件... 用法:awk [POSIX或GNU風格選項] [ - ]'程序'文件... – Prashant

+0

在這種情況下,只刪除評論和換行符和大部分空間,使它看起來很酷和緊!我會把它添加到最後。 –

0

@Prashant:嘗試:雖然詹姆斯的代碼和我的代碼沒有太大的區別。唯一的事情就是我要爲你的文字準確地匹配字符串「PARAMETER」而不是匹配字符串「PARAMETER1」。

awk -F"=" '/\[END\]/{A=""} /\[START\]/{A=1} !A && $1 == "PARAMETER"{print "NEW_VALUES";next} 1' Input_file 

我在這裏做字段分隔符爲「=」,然後在一條線上尋找字符串開始,如果是,那麼做一個變量A的值爲1的線路尋找串END,使變量a的值爲NULL 。因此,然後檢查條件,如果變量A的值是NULL,$ 1是PARAMETER然後打印新值並給下一個跳過進一步的語句。放置1將打印所有行(當然,這些行並不會隨着新值而改變,因爲當新值被打印時,程序沒有達到1,所以它不會在那裏打印)。

+0

您需要使用反斜槓來轉義'['和']'以便從字面上匹配這些字符。就像現在一樣,單詞「開始」和「結束」中的任何字符將開始/結束一個部分。 –

相關問題