用Bash中的文件名替换变量

用Bash中的文件名替换变量,bash,shell,sed,scripting,find,Bash,Shell,Sed,Scripting,Find,我有一个场景,我需要用文件名替换目录中多个文件中的一个变量(同一个变量) 例如,我有一个具有相同内容的文件列表 文件1 文件2 文件3 文件4 这些文件的内容如下: Some Text Another line of text I need to replace this $variable 我想做的是用所述文件的名称替换模式$variable的所有实例 i、 e.文件1的内容将变为 Some Text Another line of text I need to replace this f

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

例如,我有一个具有相同内容的文件列表

文件1 文件2 文件3 文件4

这些文件的内容如下:

Some Text
Another line of text
I need to replace this $variable
我想做的是用所述文件的名称替换模式$variable的所有实例

i、 e.文件1的内容将变为

Some Text
Another line of text
I need to replace this file1
Some Text
Another line of text
I need to replace this file2
文件2的内容将变为

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

我一直在研究sed,并认为它可能是一种可行的方法,但我经常错误地使用脚本,它肯定不是一个优点。

您可以使用此for循环:

while read -r f; do
   sed -i.bak "s~\$variable~$f~" "$f"
done < <(grep -l '\$variable' file*)
读取时-rf;做
sed-i.bak“s~\$variable~$f~”“$f”

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

awk -i inplace '{gsub(/\<\$variable\>/,FILENAME); print}' file*
awk-i替换“{gsub(/\/,文件名);print}”文件*

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

非常好!太好了,谢谢你,伙计。请原谅我的无知,但我如何让它真正更新相关文件,而不是仅仅输出到屏幕上非常感谢您的快速回复!我认为
/
可能会引起冲突。最好使用另一个分隔符。是的,文件名中的
/
会有问题,在
s//
@user3919278:Check updated命令的替换部分中,任何其他具有魔力的字符都会有问题。它现在将进行内联编辑,而不是在标准输出上写入。konsolebox:谢谢,伙计,我现在已经使用了
~
作为分隔符。如果OP在同一行中多次使用
$variable
,则需要添加
g