我有一个这样的文件
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
以美观。