我有多个.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
作为参数;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)。