2016-05-11 8 views
0

Ich habe ein einfaches Problem.Linux ersetzen Zeichenfolge, wenn andere Zeichenfolge zeigt 'N' Zeilen vor

In der Datei mit der nächsten Struktur.

Zustand line1
line2
line3
String je nach Zustand zu ändern.

Diese Struktur wird in der Datei eine nicht definierte Anzahl von Malen wiederholt.
ich muss die 4. Zeile abhängig vom Wert der 1. Zeile ändern. In allen Vorkommen der Datei. Ich habe die nächste Funktion im Shell-Skript erstellt und funktioniert gut.

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 
} 

Aber es ist nicht effizient, weil sed eine Kopie der Datei für jede Änderung machen. Also, wie würdest du es machen, um es effizienter zu machen?

EDIT: Um zu klären, Zeile 4 konnte nicht kommen, dann muss ich überprüfen, dass es existiert und dann 3 Zeilen vor der Bedingung verifizieren.

+0

Haben Sie erwogen, zu awk zu wechseln? Es ermöglicht einen »datengetriebenen« Ansatz in einem einzigen Prozess und mit kleinerem Code. Wenn sed auf einem System vorhanden ist, hat es wahrscheinlich auch awk – escitalopram

Antwort

1

Geben Sie diese Eingabedatei:

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

Dies ergibt die folgende Ausgabe::

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. 

(die drei Bereichsadresse

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. 

Sie das sed-Skript (sed -f script.sed input) verwenden könnte ist eine GNU-Erweiterung, also müssen Sie GNU sed)

verwenden
Verwandte Themen