bash循环替换特定字符后的字符串中间

Goo*_*gab 8 bash for bioinformatics

我有 120 个文件 (genomes.faa),每个文件之间都有标题

>GENOME1_00001 HYPOTHETICAL PROTEIN A
NQFTIAQSQVGLEDALLDL

>GENOME1_00002 HYPOTHETICAL PROTEIN B
NQFTIAQSQVGLEDALLDL

>GENOME1_00003 HYPOTHETICAL PROTEIN C
NQFTIAQSQVGLEDALLDL

etc.
Run Code Online (Sandbox Code Playgroud)

我试图删除名称后面的“_0000X”并将其替换为“|”

>GENOME1|HYPOTHETICAL PROTEIN A
NQFTIAQSQVGLEDALLDL

>GENOME1|HYPOTHETICAL PROTEIN B
NQFTIAQSQVGLEDALLDL

>GENOME1|HYPOTHETICAL PROTEIN C
NQFTIAQSQVGLEDALLDL

etc.
Run Code Online (Sandbox Code Playgroud)

我尝试这样做:

for file in *.faa
do
sed -r 's/_.*$/|/g' $file > $file.1
done
Run Code Online (Sandbox Code Playgroud)

这不会在之后保留“假设蛋白质 A”,从而导致

>ERR1156171|
MMRQSVQTVLP 
Run Code Online (Sandbox Code Playgroud)

代替

>ERR1156171|HYPOTHETICAL PROTEIN A
MMRQSVQTVLP 
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!

Sot*_*oce 11

我认为你已经非常接近工作指挥了。这对我来说对你给出的几个例子很有用:

sed -E 's/_[0-9]+ /|/' "$file" > "$file.1"
Run Code Online (Sandbox Code Playgroud)
  • 我将匹配表达式从 更改为_.*_[0-9]+ 匹配限制为仅下划线、数字和空格字符。
  • 我删除了$因为它匹配行的末尾,而不是第一个单词的末尾。
  • 我将替换命令的结尾从 更改/g/,因为您的示例在每一行中只有一个位置需要编辑,而不是多个位置。
  • 另外,不要使用扩展-E-r则表达式,因为前者与其他版本的 sed 更兼容;并引用变量扩展,以防任何文件名包含空格或特殊字符。