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)
您的sed
替换不会按预期工作,因为您永远无法匹配输入数据中的换行符。这是因为sed
逐行读取您的文件,即使用换行符作为分隔符,并且表达式单独应用于行,没有分隔换行符。
相反,稍微更改您的代码:
for fasta in ./*.fa; do
sed 's;^\(>.*\)/.\{0,10\}$;\1;' "$fasta"
done
Run Code Online (Sandbox Code Playgroud)
我所做的一些更改是:
;
作为分隔符的s///
命令,而不是默认/
。这使我们无法逃避/
模式中的 。几乎任何字符都可以用作定界符,但应该选择一个不会出现在模式或替换文本中的字符。(...)
是扩展的正则表达式语法,\{...\}
是基本的正则表达式语法。我决定使用可移植性的基本语法。这也意味着删除-r
在 GNU 中启用扩展语法的选项sed
。^
和将模式锚定到行的开头和结尾$
。另一种更短的sed
表达是
sed '/^>/s;/.\{0,10\}$;;'
Run Code Online (Sandbox Code Playgroud)
这将替换以>
字符开头的所有行(/^>/
充当后续s///
命令的“地址” )。如果该位的长度为 10 个字符或更少,则替换只是删除该/
位及其后面的位到行尾。