使用 sed 捕获

使用 sed 捕获

我有一个这样的文件

x   +   chrX    15362   15364   +   100(3)  *(0)    *(0)    *(0)    100(5)  *(0)    100(1)
y   +   chrX    153626  153626  +   100(80) 98.56(79)   100(40) 100(47) 100(88) 4(23)

我想捕获括号内的值并打印它们,以便输出如下所示

x   +   chrX    15362   15364   +   3   0   0   0   5   0   1
y   +   chrX    153626  153626  +   80  79  40  47  88  23

我想在 sed 中执行此操作。

我尝试过类似的方法,但它不起作用

sed -r 's/^.*\((\d+)\)/\1/g'

另外,我怎样才能去掉括号内的所有内容(包括括号),以便我也得到以下输出

x   +   chrX    15362   15364   +   100 *   *   *   100 *   100
y   +   chrX    153626  153626  +   100 98.56   100 100 100 4

答案1

$ sed 's/([^)]*)//g' file
x   +   chrX    15362   15364   +   100  *    *    *    100  *    100
y   +   chrX    153626  153626  +   100 98.56   100 100 100 4

在这里,我们用来sed删除输入中的任何括号。该表达式([^)]*)匹配一个左括号,后跟任意数量的非右括号字符(即数字),最后跟一个右括号。您也可以([0-9]*)在这里使用。

$ sed 's/[^[:blank:]]*(\([^)]*\))/\1/g' file
x   +   chrX    15362   15364   +   3  0    0    0    5  0    1
y   +   chrX    153626  153626  +   80 79   40 47 88 23

在这里,我们删除括号之前的位以及括号本身,并将所有内容替换为括号内的内容。之前的内容(与 匹配[^[:blank:]]*,即任意数量的非空白字符,后跟与第一个命令中相同的表达式,但捕获和sed之间的内容。捕获的字符串在命令的替换部分中由 引用。()\1


你的命令,

sed -r 's/^.*\((\d+)\)/\1/g'

无法正常工作,因为\d它是 PCRE(类似 Perl 的正则表达式)。替换\d[0-9]or[[:digit:]]不会使其工作得更好,因为它会将整行替换为最后一个括号内的数字。

答案2

尝试这个:sed -r 's/[^[:blank:]]*\(([[:digit:]]+)\)/\1/g'

  • 查找零个或多个非空白字符,后跟左括号,后跟数字(捕获),后跟右括号
  • 仅替换为捕获的数字
  • 在全球范围内执行此操作
  • \d是 PCRE 构造,不是来自扩展正则表达式

将输出通过管道输入| column -t以美观。

相关内容