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

replace string after pattern with filename

我有多个 .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

没用

谢谢

您的尝试包含两个错误:

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

所以你要做的其实是下面的:

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)。