Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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,我有一个文件,其中有几行: OTU3055 UniRef90_A0A0F7KBB1 UniRef90_A0A1Z9IPT2 OTU0856 OTU53699 UniRef90_D6PC25 UniRef90_D6PCA5 UniRef90_D6PCG3 OTU0125 UniRef90_A0A075FUN0 UniRef90_A0A075G8Q1 UniRef90_A0A075GDT2 我想删除文件中出现的所有OTUxxx事件(在“OTU”之后总是有4个数字)。我使用了sed,但它不起作用。O

我有一个文件,其中有几行:

OTU3055 UniRef90_A0A0F7KBB1 UniRef90_A0A1Z9IPT2
OTU0856 OTU53699 UniRef90_D6PC25 UniRef90_D6PCA5 UniRef90_D6PCG3
OTU0125 UniRef90_A0A075FUN0 UniRef90_A0A075G8Q1 UniRef90_A0A075GDT2
我想删除文件中出现的所有OTUxxx事件(在“OTU”之后总是有4个数字)。我使用了
sed
,但它不起作用。OTUxxx始终出现在行的开头

sed的/OTU[0-9]{4}//g'my_file.txt

我在
OTU[0-9]{4}
后面放了一个空格,因为我希望Uniref90 id位于eacg行的开头

编辑:

sed-r的/OTU[0-9]{4}//g'my_file.txt。但我还有一个问题

UniRef90_A0A0F7KBB1 UniRef90_A0A1Z9IPT2
 UniRef90_D6PC25 UniRef90_D6PCA5 UniRef90_D6PCG3
UniRef90_A0A075FUN0 UniRef90_A0A075G8Q1 UniRef90_A0A075GDT2
有些行仍然以空格开头。我尝试了sed的/^*/'my_file.txt,但它不起作用。我希望文件的第二行与其他两行一样开始,没有任何空格。

您可以使用

sed -r 's/[[:space:]]*\bOTU[0-9]{4,}\b[[:space:]]*//g' file > newfile
或者,如果可以在任何地方找到匹配项,而不仅仅是在字符串开头:

sed -r 's/[[:space:]]*\bOTU[0-9]{4,}\b//g' file | sed 's/[[:space:]]*$//' > newfile
OTU
后面的空格将与第二个代码段不匹配,因此需要使用管道
sed
命令

详细信息

  • [[:space:][]*
    -0+空格字符
  • \b
    单词边界
  • OTU[0-9]{4,}
    -
    OTU
    和4位或更多数字
  • \b
    -单词边界
  • [[:space:][]*
    -0+空格字符

鉴于您发布的输入和运行的命令,没有任何关于您发布的实际输出的解释,但是如果您希望匹配4位或更多数字,并且OTU*字符串后面的空格可以是一个制表符或一些其他非空字符的空白,那么这就是您需要使用GNU或OSX/BSD awk进行
-E

$ sed -E 's/(OTU[0-9]{4,}[[:space:]]+)+//' file
UniRef90_A0A0F7KBB1 UniRef90_A0A1Z9IPT2
UniRef90_D6PC25 UniRef90_D6PCA5 UniRef90_D6PCG3
UniRef90_A0A075FUN0 UniRef90_A0A075G8Q1 UniRef90_A0A075GDT2

将选项
-r
添加到GNU-sed。或者用\来转义两个花括号。我注意到前面的命令可以工作,但对于某些行,某些行开头的“空白”没有删除。它对一些人有效,但对其他人无效。你有什么想法吗?我尝试了sed的my_file.txt。试试
sed-r的//[:space:]*\bOTU[0-9]{4,}\b[:space:]*//g'文件
,检查。如果您使用
-E
而不是
-r
,那么它将在GNU和OSX/BSD sed中工作,而不仅仅是GNU sed。@EdMorton是的,对。