sed正在处理硬编码的文件名,但不适用于包含所述文件名的变量

时间:2016-07-20 22:30:34

标签: 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附加到字符串(是的,这可能没有意义,但是我&# 39;我只是使用一个通用的例子。我确实需要这个特定功能来处理我正在做的事情。

我遇到的问题是,当grep和字符串赋值按预期工作时,sed命令不是。令我更加困惑的是,以下命令有效。

grep -lrI "$file" dir/ | xargs sed -i 's/\(hello_world.cpp\)/\1\.bin/'

这将替换字符串" hello_world.cpp"与" hello_world.cpp.bin"在包含字符串" hello_world.cpp"的所有文件中,这正是我想要的。

如果有人可以帮助指出我的错误,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

问题出在这里:

xargs sed -i 's/\(\$file\)/\1\.bin/'

由于您在单引号内使用shell变量,因此它不会被扩展。

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

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

另请注意,您无需使用捕获组,因为您可以使用&替代。