Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed转义字符的问题_Regex_Bash_Sed - Fatal编程技术网

Regex 使用sed转义字符的问题

Regex 使用sed转义字符的问题,regex,bash,sed,Regex,Bash,Sed,我有一个文件如下所示: hairgrayingB ~intron KCND3|KCND3-IT1(-17.36kb) hairgrayingB ~intron KCND3|KCND3-IT1(-15.28kb) hairgrayingB ~intron KCND3|KCND3-IT1(-14.72kb) hairgrayingB ~intron KCND3|KCND3-IT1(-13.4kb) hairgrayingB ~intron KCND3|KCND3-IT1

我有一个文件如下所示:

hairgrayingB    ~intron KCND3|KCND3-IT1(-17.36kb)
hairgrayingB    ~intron KCND3|KCND3-IT1(-15.28kb)
hairgrayingB    ~intron KCND3|KCND3-IT1(-14.72kb)
hairgrayingB    ~intron KCND3|KCND3-IT1(-13.4kb)
hairgrayingB    ~intron KCND3|KCND3-IT1(-12.28kb)
hairgrayingB    ~intron KCND3|KCND3-IT1(-7.076kb)
hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron CACNA1E
.
.
.
我想删除每行方括号内的所有内容(包括方括号),因此我在文本编辑器上使用了此命令,它工作正常,但没有使用sed:

在文本编辑器中:

\([-,+][0-9]+.[0-9]+kb\)
关于sed:

sed '/\([-,+][0-9]+.[0-9]+kb\)/d' infile
我只是得到了相同的输出

谢谢。

要打印不带(…)的行,请执行以下操作:

输出:

hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron CACNA1E
删除(…):

输出:

hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron CACNA1E
-r
用于扩展正则表达式

如果(…)总是最后一个:

sed 's/(.*$//' filename

除非使用
-r
,否则无需转义括号<代码>(和
在BRE中没有意义,BRE是默认的
sed
regex风格。所以,你可以简单地做

sed 's/([^)]*)//g' 

正则表达式中的一般规则是“少即是多”。避免使表达过于具体。如果您想删除括号内的所有内容,只需像上面那样使用
[^]*
。没有必要定义数字和符号

鉴于您发布的示例输入/输出,您需要的只是:

$ sed 's/(.*//' file
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron CACNA1E
或:


预期的输出应该是什么样子?
(…)
是否总是在行尾?如果是这样的话,
sed的/(.*$/'文件
应该是这样的。另外,括号是
[]
,而
()
是括号。您好@fedorqui,您的简单行行成功了。为什么我的行不行呢?谢谢!您应该开始发布您想要的内容,括号之间的文本必须满足什么条件(如果有的话)。然后我们可以讨论您的命令。是的,您只想删除括号中的所有文本,还是只删除
+-
和数字?哦,而且@fedorqui实际上,严格来说,括号也可以称为括号。请参阅@EdMorton谢谢:)至于
g
,当然要删除,如果每行有一组以上的括号怎么办?OP的示例输入只有一个,但问题是“我想删除每行[…]上括号内的所有内容(包括括号)。@EdMorton除非OP澄清,否则我将回答他们的问题:)。请注意,他们的sed代码完全失败,例如,我们在这里唯一可以依赖的就是问题中的文本。这种方法既适用于已发布的示例,也适用于一般情况。删除
g
只会在有>1个括号的情况下使其中断,因为这样会删除第一个括号。如果有什么不同的话,你可以用
sed的/([^)]*)$/“
来代替
g
,但是,再一次,我不想对OP的意思做任何假设。嗯,我想我们也可以依靠他向我们展示他的输入文件的格式,更重要的是,他在文本编辑器中运行的命令,但是OK,把
g
放在末尾不会有什么坏处。不管怎样,这仍然是最好的解决方案。
$ cut -d\( -f1 file
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron KCND3|KCND3-IT1
hairgrayingB    ~intron CACNA1E
hairgrayingB    ~intron CACNA1E