【问题标题】:Bash variable assignment of a quoted regex带引号的正则表达式的 Bash 变量赋值
【发布时间】:2021-10-29 17:54:40
【问题描述】:

这是一个例子:

VALID_MODELINE_FMT=$'\'"[0-9]+x[0-9]+@[0-9]+" ([0-9]+)(\.[0-9]+)?( [0-9]+){8} [+|-]hsync [+|-]vsync\''
REJECTED_MODELINES=$(printf "$MODELINES_STR" | grep -vE $VALID_MODELINE_FMT)

运行命令时,我得到了没有任何意义的错误:

grep: ([0-9]+)(\.[0-9]+)?(: No such file or directory
grep: [0-9]+){8}: No such file or directory
grep: [+|-]hsync: No such file or directory
grep: [+|-]vsync": No such file or directory

当替换变量时一切正常:

REJECTED_MODELINES=$(printf "$MODELINES_STR" | grep -vE '"[0-9]+x[0-9]+@[0-9]+" ([0-9]+)(\.[0-9]+)?( [0-9]+){8} [+|-]hsync [+|-]vsync'

基本上,我想做的只是将正则表达式格式字符串集中在一个变量中,因为它在几个地方使用。 似乎我不能,可能是因为 shell 编程固有的替换设计很差。 但是,我想知道我是否可以绕过这一点,最好不要干预单引号。

谢谢! :)

【问题讨论】:

  • 您需要在grep 命令中引用格式变量。但是,请通过回显来检查您的VALID_MODELINE_FMT,以确保这是否是您想要的。
  • 我建议您也发布带有预期输出的示例输入。
  • @Yannick:在 zsh 中,你的方法可以工作,但在 bash 中不行。如果没有引号,bash 会对您想要成为 grep 正则表达式的内容进行通配符扩展。但是,我看不到正则表达式的初始 $'\' 的原因。第一个正则表达式字符是",它在正则表达式中没有特定含义。没有必要逃避它。

标签: bash shell variables substitution


【解决方案1】:

你必须引用变量expansion。另外,不要printf "$var" - 使用"%s"

printf "%s" "$MODELINES_STR" | grep -vE "$VALID_MODELINE_FMT"

https://shellcheck.net 检查你的脚本——它会出现这样的错误。更喜欢使用小写变量,大写变量,如 COLUMN PATH PWD USER 以及更多概念上用于导出变量。

【讨论】:

    猜你喜欢
    • 2022-08-12
    • 2010-09-18
    • 2017-04-07
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多