Распечатать строку между двумя скобками


14

У меня есть файл с этими строками

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

Мне нужен вывод как

G1,G3
G3,G4
.....

Как я могу сделать это с помощью команды sed / grep или с помощью perl?

Ответы:


18

Несколько других способов:

  • sed

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

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

    или

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

    или

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

    awk -F"[()]" '{print $2}' file 
  • ракушка

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

расскажите подробнее о том, как работает метод awk? Его тоже легко запомнить
satch_boogie

1
@satch_boogie -Fпозволяет вам выбирать, какие символы будут использовать awk для разбиения строки на поля. Здесь я даю ему символьный класс ( []), состоящий из открывающих и закрывающих скобок. Таким образом, это будет разделять линию на (и дальше ). В результате во втором поле будет содержимое круглых скобок. Например, со строкой G8 = P(G1,G3)foo, $1будет G8 = P, $2будет G1,G3и $3будет foo.
Terdon

7

Существует несколько способов сделать это:

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

или:

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

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

Он ищет открывающую круглую скобку, игнорирует ее, затем печатает все последующие символы без закрывающей скобки.

Требуется GNU grep


5

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

Чтобы сломать это:

sedявляется sTream editor. 's/^.*(//;s/)$//'это сценарий, на который отправляется sedследующий код:

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

Простое решение для резки:

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.