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?
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:
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
-F
pozwala 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
, $1
będzie G8 = P
, $2
będzie G1,G3
i $3
będzie foo
.
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
sed 's/^.*(//;s/)$//' /path/to/file
Aby to rozbić:
sed
jest s
itor 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
awk -F'(' '{print $NF}' file | sed 's/)//g'
awk -F"[()]" '{print $2}' file
jak w odpowiedzi