grep: regex nur für Übereinstimmungen zwischen Klammern

21

Wie kann ich ein Wort nur in Klammern suchen?

Eingabe: this is (test.com)

Wunschausgabe: test.com

Rahul Patil
quelle
1
Suchen Sie einen passenden 'grep'-Regex oder zB einen' sed'-Ersatzbefehl, um die angezeigte Ausgabe zu generieren?
rickhg12hs

Antworten:

28

Hier sind einige Optionen, die alle die gewünschte Ausgabe ausgeben:

  1. Verwendung grepmit dem -oFlag (nur übereinstimmenden Teil der Zeile drucken) und Perl-kompatiblen regulären Ausdrücken ( -P), die Lookarounds ermöglichen :

    printf "this is (test.com)\n" | grep -Po '(?<=\().*(?=\))'
    

    Dieser reguläre Ausdruck muss möglicherweise erklärt werden:

    • (?<=\(): Dies ist ein positiver Lookbehind , das allgemeine Format ist (?<=foo)barund das passt zu allen Fällen, bardie direkt danach gefunden wurden foo. In diesem Fall suchen wir nach einer öffnenden Klammer, \(um sie zu umgehen.

    • (?=\)): Dies ist ein positiver Ausblick und entspricht einfach der schließenden Klammer.

  2. Die -oOption, die grepbewirkt, dass nur der übereinstimmende Teil einer Zeile gedruckt wird. Wir suchen also nach den Angaben in Klammern und löschen sie dann mit sed:

    printf "this is (test.com)\n" | grep -o '(.*)' | sed 's/[()]//g'
    
  3. Analysieren Sie das Ganze mit Perl:

    printf "this is (test.com)\n" | perl -pe 's/.*\((.+?)\)/$1/'
    
  4. Analysieren Sie das Ganze mit sed:

    printf "this is (test.com)\n" | sed 's/.*(\(.*\))/\1/'
    
terdon
quelle