Regex Egrep表达式:从文件读取时如何取消单引号?
我需要使用Regex Egrep表达式:从文件读取时如何取消单引号?,regex,shell,grep,Regex,Shell,Grep,我需要使用egrep来获取索引文件中的条目 为了查找条目,我使用以下命令: egrep "^$var_name" index $var\u name是从变量列表文件读取的变量: while read var_name; do egrep "^$var_name" index done < list 我的索引文件的格式为: $ERROR['SOME_VAR'] --> n 其中n是找到变量的行 问题在于读取时,$var\u name会自动转义。启用调试模式时,将执行以下命
egrep
来获取索引文件中的条目
为了查找条目,我使用以下命令:
egrep "^$var_name" index
$var\u name
是从变量列表文件读取的变量:
while read var_name; do
egrep "^$var_name" index
done < list
我的索引文件的格式为:
$ERROR['SOME_VAR'] --> n
其中n
是找到变量的行
问题在于读取时,$var\u name
会自动转义。启用调试模式时,将执行以下命令:
+ egrep '^$ERRORS['\''SELECT_COUNTRY'\'']' index
上面的命令不起作用,因为egrep
将尝试解释模式
如果我不使用扩展版本,使用grep
或fgrep
,则仅当我删除^
锚定时,该命令才会起作用:
grep -F "$var_name" index # this actually works
问题是,我需要确保在行首进行匹配
想法?您可以使用printf“%q”
:
读取时-r变量名称;做
egrep“^$(printf”%q\n“$var\u name“)索引
完成<列表
更新:您还可以执行以下操作:
while read -r var_name; do
egrep "^\Q$var_name\E" index
done < list
读取时-r变量名称;做
egrep“^\Q$var\u name\E”索引
完成<列表
此处使用
\Q
和\E
将字符串置于文字字符串之间,删除正则表达式符号的所有特殊含义。set-x
以shell表示法显示正在执行的命令
您看到的反斜杠不会成为参数的一部分,它们只是由set-x
打印出来,以可复制的格式显示执行的命令
您的问题不是转义太多,而是转义太少:$
在regex中表示“行尾”,因此^$ERROR
永远不会匹配任何内容。类似地,[
]是一个字符范围,并且与文本方括号不匹配
与您的模式匹配的正确正则表达式应该是^\$ERROR\['SOME-VAR']
,相当于egrep“^\\$ERROR\['SOME-u-VAR']”
中的shell参数
解决此问题的选项有:
while IFS= read -r line
do
export line
gawk 'BEGIN{var=ENVIRON["line"];} substr($0, 0, length(var)) == var' index
done < list
这将防止反斜杠用作读取文件的转义字符。文件中没有反斜杠。我使用此选项运行命令,但没有任何更改。调试的输出仍然是相同的…
printf%q
对shell进行转义,而不是对regex进行转义。同意,但它对所提供的示例数据有效。调试显示:+egrep'^\$ERRORS\[\'''SELECT\'u COUNTRY\''\]
。。。它也不起作用…@HenriqueBarcelos:你能告诉我:var_name='$ERROR['SOME_var']'的输出吗;egrep“$(printf”%q\n“$var\u name“)10
while read -r var_name; do
egrep "^\Q$var_name\E" index
done < list
while IFS= read -r line
do
export line
gawk 'BEGIN{var=ENVIRON["line"];} substr($0, 0, length(var)) == var' index
done < list