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.
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