使用 sed 删除两个 space 字符之间的字符串

Remove string between two space characters with sed

不知何故我无法解决这个问题。我有以下字符串:

>sp.A9L976 PSBA_LEMMI Photosystem II protein D1 organism=Lemna minor taxid=4472 gene=psbA

我想使用 sed 删除第 1 次和第 2 次出现 space 之间的字符串。因此,在这种情况下,应该删除 PSBA_LEMMI。前两个 space 之间的字符串不包含任何特殊字符。

到目前为止,我尝试了以下方法:

sed 's/\s.*\s/\s/'

但这会删除最后出现的 space 字符串之前的所有内容,结果为:>sp.A9L976 TESTgene=psbA。我认为通过省略贪婪表达式 g sed 将只匹配字符串的第一次出现。我也试过:

sed 's/(?<=\s).*(?=\s)//'

但这没有匹配/删除任何东西。有人可以帮我吗?我错过了什么?

您可以使用

sed -E 's/\s+\S+\s+/ /'
sed -E 's/[[:space:]]+[^[:space:]]+[[:space:]]+/ /'

两个POSIX ERE模式是一样的,它们匹配一个或多个白色space,一个或多个非白色space,以及一个或多个白色spaces, just \s and \S pattern can only be used in the GNU sed version.

请注意,您不能在替换部分使用 \s 作为白色 space 字符。 \s 是一个正则表达式模式,正则表达式用于 LHS(左侧)以搜索 whitespaces。因此,需要文字 space 将 替换为 a space.

由于您还可以使用 awk 解决方案,因此您可以使用

awk '{=""}1' file

此处,行(“记录”)被拆分为白色的“字段”space(这是默认的字段分隔符),第二个字段(</code>)的值被清除使用 <code>{ = ""}1 强制 awk 输出结果(调用默认的 print 命令)。

你可以试试这个sed

sed 's/\(\.[^\s]*\) .[^\s]* \(.*\)/ /' input_file

这利用分组来排除 space 的第一次和第二次出现之间的匹配。

输出

>sp.A9L976 Photosystem II protein D1 organism=Lemna minor taxid=4472 gene=psbA

要按您指定的方式编辑 fasta 文件的 header,请使用此 Perl one-liner:

echo '>sp.A9L976 PSBA_LEMMI Photosystem II protein D1 organism=Lemna minor taxid=4472 gene=psbA' | perl -lpe 's{^(>\S+\s+)\S+\s+}{}'

打印:

>sp.A9L976 Photosystem II protein D1 organism=Lemna minor taxid=4472 gene=psbA

请注意,它仅更改 fasta headers,即使在相对罕见的序列有空格的情况下,也能保持序列完整。这在生物信息学应用中很重要:

echo ">sp.A9L976 PSBA_LEMMI Photosystem II protein D1 organism=Lemna minor taxid=4472 gene=psbA\nACTG ACTG ACTG" | perl -pe 's{^(>\S+\s+)\S+\s+}{}'

打印:

>sp.A9L976 Photosystem II protein D1 organism=Lemna minor taxid=4472 gene=psbA
ACTG ACTG ACTG

要就地编辑文件:

perl -i.bak -lpe 's{^(>\S+\s+)\S+\s+}{}' in_file.fasta

Perl one-liner 使用这些命令行标志:
-e :告诉 Perl 查找代码 in-line,而不是在文件中。
-p :一次循环输入一行,默认情况下将其分配给 $_ 。在每次循环迭代后添加 print $_
-l : 在执行代码 in-line 之前去除输入行分隔符(默认情况下在 *NIX 上为 "\n"),并在打印时附加它。
-i.bak:编辑输入文件in-place(覆盖输入文件)。覆盖之前,通过在其名称后附加扩展名 .bak.

来保存原始文件的备份副本

这里,
^ : 行首。
> : 文字“大于”字符,它标志着 fasta 格式规范中 header 的开始。
\S+:1 个或多个 non-whitespace 个字符。
\s+ : 1 个或多个空白字符。
</code> :第一个捕获的模式。使用括号进行捕获:<code>(...).

另见:
perldoc perlrun: how to execute the Perl interpreter: command line switches
perldoc perlre: Perl regular expressions (regexes)