用Bash中的文件名替换变量

时间:2014-08-07 16:58:41

标签: bash shell sed scripting find

我有一个场景,我需要在一个目录中的多个文件中用这个文件名替换一个变量(相同的变量)。

例如,我有一份内容相同的文件列表;

file1的 文件2 文件3 file4将

每个文件的内容是;

Some Text
Another line of text
I need to replace this $variable

我想要做的是将模式$ variable的所有实例替换为所述文件的名称。

即。 file1的内容将变为

Some Text
Another line of text
I need to replace this file1

并且file2的内容将变为

Some Text
Another line of text
I need to replace this file2

我一直在研究sed并认为它可能是要走的路,但我在编写脚本方面经常出错,这当然不是一个强点。

2 个答案:

答案 0 :(得分:1)

您可以将此用于循环:

while read -r f; do
   sed -i.bak "s~\$variable~$f~" "$f"
done < <(grep -l '\$variable' file*)

如果要对目录中的每个文件执行此操作,请将glob模式file*更改为*

答案 1 :(得分:0)

使用GNU awk进行就地编辑和字锚:

awk -i inplace '{gsub(/\<\$variable\>/,FILENAME); print}' file*

对于包含&\\<number>的文件名,上述操作将失败。如果这是一个问题,解决方案是使用match()或index()与substr()而不是gsub()。