用文件名替换模式后的字符串
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)。
我有多个 .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)。