2016-05-11 69 views
0

我有一個簡單的問題。linux替換字符串,如果其他字符串顯示'n'行之前

在具有下一個結構的文件中。

條件 LINE1
LINE2
line3中
字符串根據條件而改變。

該結構在文件中重複未定義的次數。
我必須根據第一行的值更改第四行。 在文件的所有發生。 我已經在shell腳本中創建了下一個函數,並且工作正常。

function normalizer() { 
list=$(grep -n "STRING" $1 |cut -f1 -d:|wc -l) 
coso=1 
while [ $coso -le $list ]; 
    do 
    direc=$(grep -n "STRING" $1 |cut -f1 -d:|head -$coso|tail -1) 
    str=$(perl -wne "print if $. == ($direc - 6)" $1) 
    if [ "$str" == "STING 2" ]; then 
      sed -i "${direc}s/STRING/DORSOC CARATR/" $1 
     else if  [ "$str" == "STRING 3" ]; then 
       sed -i "${direc}s/STRING/DORSOC CARATU/" $1 
      else 
       echo dont match 
      fi 
    fi 
    let coso=$coso+1 
done 
} 

但它效率不高,因爲sed爲每次更改都創建一個文件的副本。 那麼,你會如何做到這一點,使其更有效率?

編輯: 爲了澄清,第4行不能來,那麼我必須驗證它是否存在,然後驗證條件之前的3行。

+0

你有沒有考慮切換到awk?它允許更多的»數據驅動«方法,在一個單一的過程和更小的代碼。如果sed存在於系統中,它可能也有awk – escitalopram

回答

1

給這個輸入文件:

condition1 line1 
line2 
line3 
String to change depending on the condition. 
condition2 line1 
line2 
line3 
String to change depending on the condition. 
condition1 line1 
line2 
line3 
String to change depending on the condition. 

,你可以使用這個sed腳本(sed -f script.sed input)

/condition1/,+3 {t; t; s/change/XXXXX/ } 
/condition2/,+3 {t; t; s/change/YYYYY/ } 

我們得到以下的輸出:

condition1 line1 
line2 
line3 
String to XXXXX depending on the condition. 
condition2 line1 
line2 
line3 
String to YYYYY depending on the condition. 
condition1 line1 
line2 
line3 
String to XXXXX depending on the condition. 

(+3範圍地址是一個GNU擴展,所以你將不得不使用GNU sed)

相關問題