2017-04-04 4 views
0

Ich versuche, zwei Strings und das nächste Wort bis ein Zeichen aus einer Datei grep. Der aktuelle Inhalt sieht wie folgt aus etwas:grep für das Wort bis char

Package: wdiff\0aVersion: 1.2.2-1build1\0aArchitecture: amd64\0aMaintainer:... 
... 

Package: python\0aVersion: 2.7.2-1build1\0aArchitecture: amd64\0aMaintainer:.. 
... 

und so weiter. Ich möchte die Datei für die Worte "Paket:" und "Versionen" zusammen bis "\0a" grep. so daß der Ausgang wäre:

Package: wdiff Version: 1.2.2-1build1 
Package: python Version: 2.7.2-1build1 

und so weiter, unter Verwendung von vorzugsweise grep.

Nur um zu klären - das ist eine lange Datei mit vielen Wörtern getrennt durch "\ 0a" und ich will nur 2 Wörter und das alles nach ihnen bis "\ 0a".

Danke für die freundliche Hilfe!

+1

* bis "\ a0" * - und warum 'build1' fehlt? – RomanPerekhrest

+1

Wird in der Eingabedatei wörtlich '\ 0a' verwendet? – anubhava

+0

Ihr Beispiel hat '\ 0a', aber Ihr Text sagt' \ a0' - was ist das? Sind diese wörtlichen Zeichen, oder meinst du, Zeilenumbrüche? –

Antwort

0

Hier ist ein einzelner awk Befehl, um die Ausgabe zu erhalten:

awk -F '\\\\0a' 'NF>1{print $1, $2}' file 

Package: wdiff Version: 1.2.2-1build1 
Package: python Version: 2.7.2-1build1 

-F '\\\\0a' Sätze \0a als Eingabefeldtrenn.

+0

Das ist super, danke! Allerdings habe ich einige Zeilen, wo ich ein anderes Wort zwischen Paket und Version habe und es auch ausgibt. zum Beispiel: "Paket: apache \ 0aSource: blabla \ 0aVersion: 3.2.1" und so weiter. Wie behalte ich Source: aus der Ausgabe? –

+0

ok dann verwenden: 'awk -F '\\\\ 0a' 'NF> 1 {print $ 1, ($ 2 ~/^ Version:/$ 2: $ 3)}' Datei ' – anubhava

+0

Ja, wunderschön !! vielen Dank Alter . Hochgestimmt :) Falls ich in Zukunft ein weiteres Muster hinzufügen möchte, würde das ein drittes Wort von der Linie fangen, wie füge ich es hinzu? –

-1

die Datei für die Worte grep "Package:" und "Versions" zusammen bis bis "\ a0"

grep ermöglicht es Ihnen, Spiele zu finden, aber es wird nicht Ersetzen Sie die "nicht benötigten" Zeichen.
Verwenden Kombination von grep + sed:

cat testfile | grep -Po 'Package: .+?Version: .+?(?=\\0a)' | sed 's/\(.*\)\\0a.*\(Version.*\)/\1 \2/' 

Die beispielhafte Ausgabe:

Package: wdiff Version: 1.2.2-1build1 
Package: python Version: 2.7.2-1build1 
+0

Danke für die Antwort! Ich denke du hast mich vielleicht verstanden. Nehmen wir an, es ist eine sehr lange Datei, nicht durch Zeilen getrennt und ich möchte die Wörter "Package:" und alles danach bis zu den Zeichen "\ 0a" und auch "Version:" und alles danach bis zu den Zeichen "grep" 0a ".Es gibt auch andere Wörter in den Zeilen wie "Betreuer:", "Architektur:" und so weiter. –

+0

@JohnDoe, Sie sollten erwähnt haben, dass es einen willkürlichen Text gibt, nicht Zeilen mit Zeilenumbrüchen – RomanPerekhrest

+0

@JohnDoe, siehe mein Update – RomanPerekhrest

0

Eine Option ist:

awk -F\\ '{ pos=match($2,"build");print $1" "substr($2,3,pos-3) }' 

Wir teilen den Text mit awk und dem Trennzeichen "\" auf. Wir wollen das zweite Element vom dritten Zeichen zum Wort "build" abziehen. Also benutzen wir die Match-Funktion in awk, um herauszufinden, wo in der Zeichenkette ist die zweite Zeichenkette vom dritten Zeichen bis zu wo immer das Wort "build" erscheint (minus 3, um die "0a" am Anfang der Zeichenkette zu berücksichtigen).

Verwandte Themen