2017-06-02 1 views
-1

Hallo, ich habe eine große Datei wie:Extrahieren einer Zeichenfolge in Anführungszeichen aus einer Textdatei, auch wenn die Zeile umgebrochen

Hi This is a file from and the filename= "file1.txt" 
Hello find the filename... filename = "the name of this file is too huge and 
goes to the next line but enclosed with double quotes.txt" 
There is another file with the filename="file2.txt" size 
is "333kb"; 

Meine beabsichtigte Ausgabe ist die Dateinamen-Strings nur, ohne Zeilenumbrüche vorhanden, in eine röhrengetrennte Zeichenkette, wie die folgende:

file1.txt | the name of this file is too huge and goes to the next line but enclosed with double quotes.txt | file2.txt 

Ich benutzte den untenstehenden sed Befehl, aber das Ergebnis ist nicht wie erwartet. Es gibt nur den Dateinamen in der gleichen Zeile aus.

sed -n 's/^.*filename="\(.*\)".*/\1/p 

Bitte helfen Sie mir diese Arbeit zu bekommen, Dank im Voraus.

+1

Warum "mit' sed'" als Voraussetzung? Warum lassen Sie nicht die Person, die die Frage beantwortet, das beste Werkzeug für den Job vorschlagen, selbst wenn sie zufällig denken, es sei "awk" oder native Logik in bash oder etwas anderes? –

+0

Außerdem ist momentan nicht klar, welche Zeilenumbrüche in Ihrem Text literal sind oder nicht, da die "Dateiinhalte" als umbrochener Text gerendert werden. Sollen die '' 'Zeilenumbrüche anzeigen? –

+0

Es würde auch helfen, "riesig" mit einigen tatsächlichen Zahlen zu quantifizieren, um ein realistisches Benchmarking zu ermöglichen. –

Antwort

0

können Sie mit dieser Pipeline beginnen:

tr '\n' ' ' < input | grep -o 'filename *= *"[^"]*"' 

zu erhalten:

filename= "file1.txt" 
filename = "the name of this file is too huge and goes to the next line but enclosed with double quotes.txt" 
filename="file2.txt" 

clean-up:

tr '\n' ' ' < input | grep -o 'filename *= *"[^"]*"' | sed 's/.*"\([^"]*\)"/\1/' 

zu erhalten:

file1.txt 
the name of this file is too huge and goes to the next line but enclosed with double quotes.txt 
file2.txt 
0

GNU awk für Multi-char RS und gensub():

$ awk -v RS='\\<filename\\s*=\\s*"[^"]+"' -F'"' -v OFS=' | ' ' 
    RT {$0=gensub(/\s+/," ","g",RT); printf "%s%s", (NR>1?OFS:""), $2} 
    END {print ""} 
' file 
file1.txt | the name of this file is too huge and goes to the next line but enclosed with double quotes.txt | file2.txt 
Verwandte Themen