打印两个括号之间的字符串

use*_*153 19 grep sed 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)
Run Code Online (Sandbox Code Playgroud)

我需要输出为

G1,G3
G3,G4
.....
Run Code Online (Sandbox Code Playgroud)

如何使用 sed/grep 命令或使用 perl 来完成?

ter*_*don 27

其他几种方式:

  • @satch_boogie `-F` 允许您选择 awk 将使用哪些字符将行拆分为字段。在这里,我给它一个字符类(`[]`),由左括号和右括号组成。所以它会在 `(` 和 `)` 上分割线。因此,第二个字段将是括号的内容。例如,对于字符串`G8 = P(G1,G3)foo`,`$1` 将是`G8 = P`,`$2` 将是`G1,G3`,而`$3` 将是`foo`。 (2认同)

cuo*_*glm 8

有不止一种方法可以做到:

perl -nle 'print $1 if /\((.*)\)/' file
Run Code Online (Sandbox Code Playgroud)

或者:

awk 'NR > 1 {print $1}' RS='(' FS=')' file
Run Code Online (Sandbox Code Playgroud)


gle*_*man 6

grep -oP '\(\K[^)]+' file
Run Code Online (Sandbox Code Playgroud)

寻找左括号,忽略它,然后打印所有跟随的非右括号字符。

需要 GNU grep


Dop*_*oti 6

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

要分解这个:

sed是流sitor 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
Run Code Online (Sandbox Code Playgroud)