bash变量和正则表达式比较

时间:2016-01-21 17:14:34

标签: regex bash variables puzzle

x='abc.xyz'y='abc:xyz'以便以下成立(打印“匹配”和“差异”):

[[ "${x}" =~ abc".xyz" ]] && echo "matches"
[[ "${y}" =~ abc".xyz" ]] || echo "diff"

现在,可以提取文字l=".xyz"并且测试仍然有效(请注意l引号周围的双引号):

[[ "${x}" =~ abc"${l}" ]] && echo "matches"
[[ "${y}" =~ abc"${l}" ]] || echo "diff"

问题是:如果我们进一步尝试r="abc\"${l}\""r="abc${l}",第一次测试就不会打印“匹配”:

[[ "${x}" =~ ${r} ]] && echo "matches"
[[ "${y}" =~ ${r} ]] || echo "diff"

通过两项测试的r的正确形式应该是什么?

1 个答案:

答案 0 :(得分:1)

shell通常从命令行中删除所有未加引号的"(它们控制 只有当参数应该被拆分时才会被拆分) 是=~之后的特殊处理。引号在这里像逃脱一样工作, 引号之间的所有内容都只作为匹配的原始字符处理 本身(除了仍然有效的$变量替换)。

只有一种评估模式,因此引用 隐藏在变量中被视为常规引号,并且可以 不会触发特殊引用语法。

您需要转义.中的$l(或任何其他有效)字符 并且引用语法在变量中不起作用。

如果$l始终等于.xyz,您可以使用r="abc\\${l}"来获得正确的匹配。 它等于r='abc\.xyz'