【问题标题】:Remove string between two space characters with sed使用 sed 删除两个空格字符之间的字符串
【发布时间】:2021-11-16 00:51:40
【问题描述】:

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

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

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

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

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

但这会删除最后出现的空格字符串,导致:>sp.A9L976 TESTgene=psbA。我认为通过省略贪婪表达式g sed 只会匹配字符串的第一次出现。我也试过了:

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

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

【问题讨论】:

  • 使用 awk 这只是awk '{$2 = ""} 1' file
  • 那很优雅!非常感谢!

标签: regex bash sed bioinformatics fasta


【解决方案1】:

你可以使用

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

两个POSIX ERE模式是一样的,它们匹配一个或多个空格,一个或多个非空格,以及一个或多个空格,只是\s\S模式只能在GNU @987654324中使用@版本。

请注意,您不能在替换部分中使用\s 作为空白字符。 \s 是一种正则表达式模式,正则表达式用于 LHS(左侧)搜索空格。因此,需要一个文字空间来替换 一个空格。

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

awk '{$2=""}1' file

这里,行(“记录”)被分成带有空格的“字段”(它是默认的字段分隔符),第二个字段($2)的值用{$2 = ""}1清除强制 awk 输出结果(调用默认的print 命令)。

【讨论】:

  • 很好的解释。非常感谢。我接受了您的回答,因为它通过 sed 解决了我的问题并为我提供了有用的见解。
【解决方案2】:

你可以试试这个sed

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

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

输出

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

【讨论】:

  • 非常感谢您的帮助!
  • @han5000 不客气
【解决方案3】:

要按照您的指定编辑 fasta 文件的标题,请使用这个 Perl 单行:

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

打印:

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

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

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+}{$1}'

打印:

>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+}{$1}' in_file.fasta

Perl 单行代码使用这些命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-p:循环输入一行一次,默认分配给$_。在每次循环迭代后添加print $_
-l:在执行内联代码之前去除输入行分隔符(默认为 *NIX 上的"\n"),并在打印时附加它。
@987654334 @ :就地编辑输入文件(覆盖输入文件)。在覆盖之前,保存原始文件的备份副本,方法是在其名称后附加扩展名 .bak

这里,
^:行首。
&gt;:文字“大于”字符,在 fasta 格式规范中标记标题的开始。
\S+: 1 个或多个非空白字符。
\s+:1 个或多个空白字符。
$1:第一个捕获的模式。使用括号进行捕获:(...)

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

【讨论】:

  • 不错!我对 perl 还不是很熟悉,但我会尝试更多地了解它。感谢您的精彩解释。
  • 在这种情况下,正则表达式中的(.*) 和替换模式中的$2 都可以删除。我们不需要触摸第二个“单词”之后的文本。
  • @WiktorStribiżew 感谢您提出删除不必要的(.*)$2 的建议。更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2016-04-03
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多