带有数字量词的 sed - 如何?

Lau*_*ura 2 sed regular-expression

我正在尝试编辑多个文件的 fasta 标题,以删除正斜杠及其后的所有内容(只要“它之后的所有内容”等于或小于 10 个字符)。标题行用“>”标记。

for i in ./*.fa;do sed -r 's/(>.*)\/.\{,10\}\n/\1\n/' "$i"; done
Run Code Online (Sandbox Code Playgroud)

我也试过

for i in ./*.fa;do sed -r 's/(>.*)\/.{,10}\n/\1\n/' "$i"; done
Run Code Online (Sandbox Code Playgroud)

但似乎并没有更好。我的预感是 {,10} 量词会破坏事物。我不确定。帮助将不胜感激!

例如,如果以下内容在文件中:

>header1_some_extra_data_here/1-1000
ATGCGGGTACCCCA
>code/header2_some_extra_data
AGGTCCCCGGGAAAAA
Run Code Online (Sandbox Code Playgroud)

我希望以下是输出:

>header1_some_extra_data_here
ATGCGGGTACCCCA
>code/header2_some_extra_data
AGGTCCCCGGGAAAAA
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 7

您的sed替换不会按预期工作,因为您永远无法匹配输入数据中的换行符。这是因为sed逐行读取您的文件,即使用换行符作为分隔符,并且表达式单独应用于行,没有分隔换行符。

相反,稍微更改您的代码:

for fasta in ./*.fa; do
    sed 's;^\(>.*\)/.\{0,10\}$;\1;' "$fasta"
done
Run Code Online (Sandbox Code Playgroud)

我所做的一些更改是:

  1. 使用;作为分隔符的s///命令,而不是默认/。这使我们无法逃避/模式中的 。几乎任何字符都可以用作定界符,但应该选择一个不会出现在模式或替换文本中的字符。
  2. 仅使用标准的基本正则表达式语法。在您的模式中,(...)是扩展的正则表达式语法,\{...\}是基本的正则表达式语法。我决定使用可移植性的基本语法。这也意味着删除-r在 GNU 中启用扩展语法的选项sed
  3. 分别用^和将模式锚定到行的开头和结尾$
  4. 不要尝试在替换位中插入换行符。

另一种更短的sed表达是

sed '/^>/s;/.\{0,10\}$;;'
Run Code Online (Sandbox Code Playgroud)

这将替换以>字符开头的所有行(/^>/充当后续s///命令的“地址” )。如果该位的长度为 10 个字符或更少,则替换只是删除该/位及其后面的位到行尾。