Роздрукуйте рядок між двома дужками


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 -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дозволяє вам вибрати, який символ ( ив ) буде використовуватися для розділення рядка на поля. Тут я даю йому клас символів ( []), що складається з дужок, що відкриваються та закриваються. Таким чином, вона буде розділяти лінію на (і далі ). Як результат, 2-е поле буде вмістом дужок. Наприклад, зі струною 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є sтрем ітором ed. '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 | вирізати -d "(" -f2 | вирізати -d ")" -f1


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.