2016-04-08 18 views
-4

ich den Inhalt in() aus den folgenden Zeilen, zum Beispiel grep will:grep Inhalt in Klammern

name (Jack) 
name (Lily) 
name (Kobe) 

Die folgende awk die Arbeit tun, aber ich verstehe nicht, wie das funktioniert " [()] 'Arbeit, kann jemand es Charakter für Charakter erklären?

Wenn ich grep oder sed verwenden möchte, was wäre die Syntax, bitte erläutern Sie im Detail.

+3

Es gibt reichlich Dokumentation von 'awk',' grep' und 'sed' auf der anderen Seite von Google. –

+0

Lesen Sie das Buch Effective Awk Programming, 4. Ausgabe, von Arnold Robbins für die Antwort auf diese und all Ihre zukünftigen grundlegenden awk Fragen. –

Antwort

0

Grep kann nicht nur die übereinstimmenden Zeichenketten zurückgeben, dafür ist awk gedacht. Das sagte ...

grep "\((.*)\)" filename 

sed "s|\((.*)\)|REPLACEMENT|" filename 
+2

Grep hat die Option '-o', um nur die übereinstimmenden Zeichenfolgen zurückzugeben. –

1

Mit grep können Sie nicht Einfanggruppen verwenden (benötigt -P Option) und Bericht nur passende (-o Option)

$ echo "name (Jack)" | grep -oP "(?<=\().*(?=\))" 

Jack  

in ähnlicher Weise mit sed

$ echo "name (Jack)" | sed -r 's/.*\((.*)\).*/\1/' 

Jack 
0

Ich habe versucht, die vorgeschlagenen Lösungen, mehrere Content-Einträge pro Zeile mit:

echo "first name (Jack) , seconde name (Lily)" | awk -F'[()]' '{print $2}' 
#Jack 

echo "first name (Jack) , seconde name (Lily)" | grep -oP "(?<=\().*(?=\))" 
#Jack) , seconde name (Lily 

echo "first name (Jack) , seconde name (Lily)" | sed -r 's/.*\((.*)\).*/\1/' 
#Lily 

Dafür biete ich eine robustere Lösung:

Lösungen:

echo "name (Jack)"| sed -n 's/[^(|^)]*(\([^(|^)]*\))/\1\n/gp' 
#Jack 

oder noch einfacher:

echo "name (Jack)"| sed -n 's/[^(]*(\([^)]*\))/\1 /gp' 
#Jack 

Test mehrerer Einträge pro Zeile:

echo "first name (Jack) , seconde name (Lily)" | sed -n 's/[^(]*(\([^)]*\))/\1 /gp' 
#Jack Lily 

oder

echo "first name (Jack) , seconde name (Lily)" | sed -n 's/[^(]*(\([^)]*\))/\1\n/gp' 
#Jack 
#Lily