
Ich muss ein Skript schreiben, um einen Teil der Datei durch einen anderen zu ersetzen. Ich verarbeite Hunderte von Dateien.
Ich habe eine Liste mit Befehlen, die zu einer Reihe von Textdateien hinzugefügt werden sollen. Aber in den Dateien habe ich am Anfang gemeinsame Befehle.
Ich möchte einfach die Befehlsliste durch meine Befehlsliste ersetzen. Weitere Informationen finden Sie weiter unten.
Originaldatei
%apj=E:\Work\Informatin\Regarding work\DND.apj
%mem=4GB
%nprocshared=2
#p oyu opsd qtnv/1-a(x) kglgg=uioewr
Application
0 1
X -3.66480600 0.10278400 -0.00655500
Y -4.11487100 1.45621700 -0.05226200
Z -5.10300200 1.90042600 0.83864800
1 2 1.0 13 1.0 23 1.0
2 3 1.5 4 1.5
3 5 1.5 6 1.0
4 7 1.5 8 1.0
Zeichen, die ich ersetzen möchte
%apj=D:\Store\Data\Diff All\SMC.apj
%mem=800MB
%nprocshared=4
#p udf AMER hbvn/3-b(n) huggh=whea
Use
0 1
X -3.66480600 0.10278400 -0.00655500
Y -4.11487100 1.45621700 -0.05226200
Z -5.10300200 1.90042600 0.83864800
Nach dem Ersetzen durch meine Befehlsliste möchte ich auch die Zeichen löschen, die nach einer Leerzeile, also den folgenden Zeilen, stehen und das Leerzeichen beibehalten.
1 2 1.0 13 1.0 23 1.0
2 3 1.5 4 1.5
3 5 1.5 6 1.0
4 7 1.5 8 1.0
Antwort1
Ich denke, das ist, was Sie brauchen:
sed '1,6d
7c%apj=D:\Store\Data\Diff All\SMC.apj\
%mem=800MB\
%nprocshared=4\
#p udf AMER hbvn/3-b(n) huggh=whea\
\
Use\
/^$/q' filename
Anstatt zeilenweise zu ersetzen, werden die ersten sechs Zeilen gelöscht ( 1,6d
) und die siebte durch den neuen Header ersetzt, der mit dem c
Befehl eingefügt wurde. Abschließend wird die Verarbeitung bei der nächsten leeren Zeile abgebrochen.
Wenn die erwartete Ausgabe zurückgegeben wird, fügen Sie eine Option hinzu, -i
um den Ersetzungsvorgang direkt in der Datei durchzuführen (GNU sed
, angepasst an die BSD-Version).