Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Egrep表达式:从文件读取时如何取消单引号?_Regex_Shell_Grep - Fatal编程技术网

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参数

解决此问题的选项有:

  • 如果您希望能够在输入文件中使用正则表达式,那么需要像上面那样包含正则表达式转义,以便您的模式有效

  • 如果希望能够使用任意的文字字符串,请使用能够灵活地进行文字匹配的工具。这需要跨越一些障碍,因为UNIX工具由于遗留原因非常草率

  • 这是一个有awk的:

    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