【问题标题】:How to use variable names when grep and sed are combined?grep 和 sed 组合时如何使用变量名?
【发布时间】:2015-11-02 08:18:47
【问题描述】:

我想在一个目录中的所有文件中递归地搜索一个字符串并用不同的字符串替换它。我可以像这样在一个文件上使用 sed 并且它可以工作:

sed -i "s|${searchStr}|${replaceStr}|g" "${rootDir}"file.cs

但是当我将它与 grep 一起使用时,我没有看到文件中的更改或收到任何错误消息。

这行得通:

grep -rnlis --include=*.{html,css,js,aspx} './' -e "/images/" |
 xargs -i@ sed -i "s|/images/|https://example.com/Images/|I" @

尝试了这些但没有用:

searchStr='/images/'
replaceStr='https://example.com/Images/'
...  -e "$searchStr" | xargs -i@ sed -i "s|$searchStr|$replaceStr|I" @

...  -e "${searchStr}" | xargs -i@ sed -i "s|${searchStr}|${replaceStr}|I" @

错误消息与表达式中的变量名称一起使用时:

: No such file or directoryult.js

: No such file or directoryders.aspx

: No such file or directoryork.css

: No such file or directoryal-power.js

如何使用变量名称而不是硬编码?

环境:cygwin (so Windows GNU sed /grep)

【问题讨论】:

  • 如果不使用 sed 会怎样? grep 本身是否返回任何结果?当管道不起作用时,您应该分解管道。
  • 如果字面意思有效,变量不会无效。你一定是在某处打错字了。
  • 您的示例使用/g,而脚本使用/I。这对您的sed 来说是一个有效的选项吗? (除非您希望每行有多个匹配项,否则您不需要 /g 标志。)
  • 如果您将命令更改为echo sed,您应该会发现问题不在于变量插值。
  • @tripleee --include=*.{html,css,js,aspx} 使用shell扩展,并扩展为多个包含标志,试试看。 I 在 sed 中不区分大小写。

标签: regex bash sed


【解决方案1】:

感谢@NeronLeVelu,这是解决方案:

searchStr='/images/' replaceStr='https://example.com/Images/' grep -rnlis --include=*.{html,css,js,aspx} "$rootDir" -e "/images/" | while read File; do sed -i "s|${searchStr}|${replaceStr}|I" "${File}"; done

它完美地工作并递归替换rootDir中的searchStr。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2017-06-29
    • 2016-05-07
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多