Linux sed用于硬编码文件名,但不用于包含所述文件名的变量

Linux sed用于硬编码文件名,但不用于包含所述文件名的变量,linux,bash,shell,sed,scripting,Linux,Bash,Shell,Sed,Scripting,很抱歉,如果这是一个愚蠢的问题,我只是不知道我的sed命令有什么问题 这是我拥有的全部命令: file="hello_world.cpp" grep -lrI "$file" dir/ | xargs sed -i 's/\(\$file\)/\1\.bin/' 基本上,我正在搜索任何包含字符串“hello_world.cpp”的文件,然后将它们传递到sed中,以便将扩展名.bin附加到字符串中(是的,这可能没有意义,但我只是使用一个通用示例。我确实需要这个特定的功能来完成我的工作) 我遇到的

很抱歉,如果这是一个愚蠢的问题,我只是不知道我的sed命令有什么问题

这是我拥有的全部命令:

file="hello_world.cpp"
grep -lrI "$file" dir/ | xargs sed -i 's/\(\$file\)/\1\.bin/'
基本上,我正在搜索任何包含字符串“hello_world.cpp”的文件,然后将它们传递到sed中,以便将扩展名.bin附加到字符串中(是的,这可能没有意义,但我只是使用一个通用示例。我确实需要这个特定的功能来完成我的工作)

我遇到的问题是,虽然grep和string赋值按预期工作,但sed命令却不能。更让我困惑的是,下面的命令是有效的

grep -lrI "$file" dir/ | xargs sed -i 's/\(hello_world.cpp\)/\1\.bin/'
这将在包含字符串“hello\u world.cpp”的所有文件中,用“hello\u world.cpp.bin”替换字符串“hello\u world.cpp”,这正是我想要的

如果有人能帮我指出错误,我将不胜感激。谢谢。

问题在这里:

xargs sed -i 's/\(\$file\)/\1\.bin/'
因为在单引号中使用shell变量,所以它不会被展开

可以使用双引号将其展开:

xargs sed -i "s/$file/&.bin/"

还请注意,不需要使用capture group,因为您可以使用
&
来替代它。

在sed中使用双引号而不是单引号。使用shell变量时,我知道这很简单。非常感谢。你介意把你的评论移到答案部分,这样我就可以把它标记为答案了吗?