grep zwischen zwei Zeilen mit angegebener Zeichenfolge

grep zwischen zwei Zeilen mit angegebener Zeichenfolge

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 test1gefunden, Dateinummer erhöhen und Ausgabe starten (also drehen on)
  • Wenn aktiviert, wird die Zeile mit dem Dateinamen „newfileFILE.txt“ gedruckt, wobei FILE die Dateinummer ist.
  • Wenn test2gefunden, Ausgabe beenden (also ausschalten)

Anschließend können Sie die beiden Dateien newfile.txtmit 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.

verwandte Informationen