Ich habe diese einfache Plat-Datei (file.txt)
a43
test1
abc
cvb
bnm
test2
test1
def
ijk
xyz
test2
kfo
Ich brauche alle Zeilen zwischen test1 und test2 in zwei Formen, die erste erstellt zwei neue Dateien wie
newfile1.txt:
test1
abc
cvb
bnm
test2
neueDatei2.txt
test1
def
ijk
xyz
test2
und die zweite Form erstellt nur eine neue Datei wie:
neueDatei.txt
test1abccvbbnmtest2
test1abccvbbnmtest2
Haben Sie Vorschläge?
Für die zweite Form habe ich dies verwendet
sed -n '/test1/,/test2/p' file.txt > newfile.txt
Aber es gibt mir ein Ergebnis wie
test1abccvbbnmtest2test1abccvbbnmtest2
Ich brauche eine Rückleitung wie:
test1abccvbbnmtest2
test1abccvbbnmtest2
Antwort1
Ein awk-Oneliner für den ersten Fall:
awk '/^test1/{file++; on=1} on{print >("newfile" file ".txt")} /^test2/{on=0}' file.txt
was sagt:
- Wenn
test1
gefunden, Dateinummer erhöhen und Ausgabe starten (also drehenon
) - Wenn aktiviert, wird die Zeile mit dem Dateinamen „newfileFILE.txt“ gedruckt, wobei FILE die Dateinummer ist.
- Wenn
test2
gefunden, Ausgabe beenden (also ausschalten)
Anschließend können Sie die beiden Dateien newfile.txt
mit dem Shell-Oneliner konvertieren:
for file in newfile?.txt; do tr -d '\n' <$file; echo; done > newfile.txt
das besagt: „Entferne aus jeder Datei alle Zeilenumbrüche.“
Antwort2
Für Ihr zweites Formular:
sed -n '/test1/,/test2/p' file.txt | xargs > newfile.txt ; sed 's/test2/&\n/g' newfile.txt | sed -e 's/^[ \t]*//'
- sed -n '/test1/,/test2/p' file.txt --> Text zwischen Test1 und Test2 erfassen
- xargs > newfile.txt --> Text effektiv in „Zeile“ umwandeln, obwohl der Zweck von xargs vielleicht ein anderer ist.
- sed 's/test2/&\n/g' newfile.txt --> neue Zeile nach dem Muster „test2“ hinzufügen
- sed -e 's/^[ \t]*//' --> Leerzeichen am Anfang jeder Zeile löschen.