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


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

回答:


17

他のいくつかの方法:

  • 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 theを-F使用すると、awkが行をフィールドに分割するために使用する文字を選択できます。ここでは、[]開き括弧と閉じ括弧で構成される文字クラス()を指定しています。そのため、行を何度も分割()ます。その結果、2番目のフィールドは括弧の内容になります。例えば、文字列でG8 = P(G1,G3)foo$1なりますG8 = P$2となりますG1,G3$3なりますfoo
テルドン

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.