用文件名替换模式后的字符串

问题描述 投票:1回答:1

我有多个.gbf文件,我需要将单词DEFINITION的每个实例后的所有内容替换为该行末尾的所有内容,并使用其各自的文件名(在它们之间考虑两个空格)。

文件名示例:GCF_000219725.1_ASM882v1 ___ Lalala_holae_9a5c.gbf

文件中感兴趣的部分:

DEFINITION  random_chacacters_including_spaces

想要的输出:

DEFINITION  GCF_000219725.1_ASM882v1___Lalala_holae_9a5c.gbf

正在思考:

for f in *.gbf; do sed 's/DEFINITION  .*$/DEFINITION  "$f"/g'; done

不起作用

谢谢

bash sed text-processing
1个回答
0
投票

您的尝试包含两个错误:

  • 它在单引号表达式中使用$f(是的,两个"也是单引号表达式的一部分);
  • sed命令没有提供文件名,该文件名是$f作为参数;
  • 此外,g命令中不需要s标志。

所以您实际上想做的是以下事情:

for f in *.gbf
do
  sed 's/DEFINITION  .*$/DEFINITION  '"$f"'/' "$f" > "$f.new"
done

其中sed脚本是三个字符串的串联,依次为单引号,双引号,单引号。这种方法可以防止在单引号的部分进行扩展,同时允许在双引号的部分进行扩展。在您提供的特定示例中,没有什么区别,但是通常建议使用单引号字符串(sed命令是字符串),除非您需要将双引号引起来(参见Learning the bash Shell, 3rd Edition, top of page 147)。在后一种情况下,sed命令为:

  sed "s/DEFINITION  .*$/DEFINITION  $f/" "$f" > "$f.new"

此外,您需要将输出放置在某个位置,例如在名为$f.new的新文件中(或者,如果我没有记错的话,也可以使用sed-i选项,该选项不是POSIX)。

© www.soinside.com 2019 - 2024. All rights reserved.