【问题标题】:sed is working for a hard-coded file name but not for variable containing said file name [duplicate]sed 适用于硬编码文件名,但不适用于包含所述文件名的变量[重复]
【发布时间】:2016-11-24 07:40:56
【问题描述】:

对不起,如果这是一个愚蠢的问题,但我只是迷失了我的 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”,这正是我想要的。

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

【问题讨论】:

  • 在使用 shell 变量时在 sed 中使用双引号而不是单引号
  • 该死,我知道这很简单。谢谢你。您介意将您的评论移至答案部分,以便我将其标记为答案吗?

标签: linux bash shell sed scripting


【解决方案1】:

问题来了:

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

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

你可以使用双引号来扩展它:

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

另外请注意,不需要使用捕获组,因为您可以使用 & 替换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多