【发布时间】: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