Я маю файл з цими рядками
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?
Я маю файл з цими рядками
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?
Відповіді:
Ще кілька способів:
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
-F
дозволяє вам вибрати, який символ ( ив ) буде використовуватися для розділення рядка на поля. Тут я даю йому клас символів ( []
), що складається з дужок, що відкриваються та закриваються. Таким чином, вона буде розділяти лінію на (
і далі )
. Як результат, 2-е поле буде вмістом дужок. Наприклад, зі струною G8 = P(G1,G3)foo
, $1
буде G8 = P
, $2
буде G1,G3
і $3
буде foo
.
grep -oP '\(\K[^)]+' file
Він шукає круглі дужки, що відкриваються, ігнорує його, а потім друкує всі наступні символи, що не є близькими дужками.
Потрібен GNU grep
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
awk -F'(' '{print $NF}' file | sed 's/)//g'