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

标签 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 附加到字符串(是的,这可能没有意义,但我只是使用通用的例如。我的工作确实需要这个特定的功能)。

我遇到的问题是,虽然 grep 和字符串分配按预期工作,但 sed 命令不是。更让我困惑的是,下面的命令是有效的。

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

这会将所有包含字符串“hello_world.cpp”的文件中的字符串“hello_world.cpp”替换为“hello_world.cpp.bin”,这正是我想要的样子。

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

最佳答案

问题在这里:

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

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

可以用双引号来展开:

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

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

关于linux - sed 适用于硬编码文件名,但不适用于包含所述文件名的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38491931/

相关文章:

Python 脚本打开 bash 提示终止脚本

r - 在 R 中使用 system2() 调用 shp2pgsql

shell - 通过SSH运行shell时如何自动输入?

linux - 如何在 .zip 文件中使用 grep

java - TeamCity-删除自动添加的命令行参数?

c - OpenCV 2.3.0+ : cvCaptureFromCAM returns null

linux - 使用 Bash 将多个相似的行拆分为两个单独的文件

linux - 如何确定我的 shell 管道中最慢的组件?

linux - 每 10 秒清除我的脚本日志

java - 在linux中执行dos2unix命令后执行jar文件抛出错误