Wydrukuj ciąg między dwoma nawiasami


14

Mam plik z tymi liniami

G8 = P(G1,G3)
G9 = P(G3,G4)
G12 = P(G2,G9)
G15 = P(G9,G5)
G16 = P(G8,G12)
G17 = P(G12,G15)

Potrzebuję danych wyjściowych jako

G1,G3
G3,G4
.....

Jak mogę to zrobić za pomocą komendy sed / grep lub Perla?

Odpowiedzi:


18

Kilka innych sposobów:

  • sed

    sed 's/.*(\(.*\))/\1/' file 
  • perl

    perl -pe 's/.*\((.*)\)/$1/' file 

    lub

    perl -lanF"[()]" -e 'print $F[1]' file 

    lub

    perl -pe 's/.*\((.+?)\).*/$1/;' file 
  • awk

    awk -F"[()]" '{print $2}' file 
  • muszla

    while IFS="()" read a b; do echo "$b"; done < file 

czy mógłbyś powiedzieć więcej o tym, jak działa metoda awk ?, też łatwo ją zapamiętać
satch_boogie

1
@satch_boogie -Fpozwala ci wybrać, jakich znaków awk użyje do podzielenia linii na pola. Tutaj nadaję mu klasę znaków ( []) składającą się z nawiasów otwierających i zamykających. Więc dzieli linię w (kółko ). W rezultacie drugie pole będzie zawartością nawiasów. Na przykład z łańcucha G8 = P(G1,G3)foo, $1będzie G8 = P, $2będzie G1,G3i $3będzie foo.
terdon

7

Jest na to więcej niż jeden sposób:

perl -nle 'print $1 if /\((.*)\)/' file

lub:

awk 'NR > 1 {print $1}' RS='(' FS=')' file

5
grep -oP '\(\K[^)]+' file

Wyszukuje nawias otwierający, ignoruje go, a następnie drukuje wszystkie znaki, które nie znajdują się w nawiasach zamkniętych.

Wymaga GNU grep


5

sed 's/^.*(//;s/)$//' /path/to/file

Aby to rozbić:

sedjest sitor tream ed. 's/^.*(//;s/)$//'jest wysyłany skrypt sed, który dzieli się następująco:

s/^.*(//    substitute nothing for the beginning of any line (`^`) followed by anything up until an open-paren (`(`)
s/)$//      substitute nothing for a close-paren (`)`) followed immediately by the end of a line

1

Proste rozwiązanie cięcia:

$ cat test01 | cut -d "(" -f2 | cut -d ")" -f1


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.