web-dev-qa-db-ja.com

2つの括弧の間の文字列を出力します

これらの行を含むファイルがあります

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を使用してどうすればよいですか?

15
user56153

他のいくつかの方法:

  • 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 
    
19
terdon

それには複数の方法があります。

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

または:

awk 'NR > 1 {print $1}' RS='(' FS=')' file
7
cuonglm
grep -oP '\(\K[^)]+' file

これは開き括弧を探し、それを無視して、その後に続くすべての閉じ括弧ではない文字を出力します。

GNU grepが必要

5
glenn jackman

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

これを分解するには:

sedstream 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
5
DopeGhoti

簡単なカットソリューション:

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

1
Sanket
awk -F'(' '{print $NF}' file | sed 's/)//g'
0
Raid_Master