【问题标题】:Bash script - variable expansion within backtick/grep regex stringBash 脚本 - 反引号/grep 正则表达式字符串中的变量扩展
【发布时间】:2015-05-06 20:50:16
【问题描述】:

我正在尝试在我的 bash 脚本中的反引号内、正则表达式搜索字符串内扩展一个变量。

我想要替换 $VAR

我匹配的行是这样的:

start....一些字符.....id:.....一些字符.....[variable im searching for]....一些字符....end

var=`grep -E '^.*id:.*$VAR.*$' ./input_file.txt`

这可能吗?

它似乎不起作用。我知道我通常可以使用"$VAR" 扩展变量,但这不会直接搜索正则表达式中的那些字符吗?我不确定这里优先考虑什么。

【问题讨论】:

  • 避免使用旧的和不推荐使用的反抽头,使用这样的括号:var=$(grep...... txt)

标签: regex bash scripting grep


【解决方案1】:

您需要将表达式放在双引号中(然后转义任何需要转义的内容)才能对变量进行插值。

var=$(grep -E "^.*id:.*$VAR.*\$" ./input_file.txt)

(这里的反斜杠不是绝对必要的,但我把它放在这里是为了给你一个想法。你的真实表达可能更复杂。)

【讨论】:

    【解决方案2】:

    变量会以反引号展开,但不会以单引号展开。

    所以您需要为您的正则表达式字符串使用双引号(我不确定您对此有什么顾虑)或同时使用这两个引号。

    所以

    var=`grep -E "^.*id:.*$VAR.*$" ./input_file.txt`
    

    var=`grep -E '^.*id:.*'"$VAR"'.*$' ./input_file.txt`
    

    此外,您可能希望使用 $(grep ...) 而不是反引号,因为它们是更现代的方法,具有更好的句法属性并且能够嵌套。

    【讨论】:

    • 谢谢,我听说$() 更好,虽然我也听说反引号更有可能向后兼容。这也是真的吗?
    • 从这个千年开始的任何合理的东西都应该支持现代语法。我认为即使是HP-UX 和AIX。当然,shell 是 Bash 的任何东西。
    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2019-12-28
    • 2023-03-15
    • 2016-10-22
    • 2016-12-04
    • 2021-09-07
    相关资源
    最近更新 更多