使用 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)
不知何故我无法解决这个问题。我有以下字符串:
>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)