UNIX:使用与grep匹配单引号或双引号的正则表达式

时间:2017-07-20 14:58:33

标签: shell grep

我有一个字符串说

string="MYSTRING"

现在我想grep出现任何"MYSTRING"(带双引号),以便在启动时必须有括号,基本上我想搜索,其中"MYSTRING"位用作函数的参数。所以,

foo( "MYSTRING"    //postive
foo("MYSTRING"      //positive
foo('MYSTRING'      //positive
foo( 'MYSTRING'      //positive
var a = "MYSTRING"  //negative

我用过:

string="MYSTRING"
regexstring="[(]*\"$string\""
grep -e "$regexString" <<'EOF'
foo( "MYSTRING"    //postive
foo("MYSTRING"      //positive
foo('MYSTRING'      //positive
foo( 'MYSTRING'      //positive
var a = "MYSTRING"  //negative
EOF

理想情况下,所有在其旁边都有“正面”且没有“负面”项目的项目会匹配。需要改变什么来实现这一目标?

1 个答案:

答案 0 :(得分:1)

执行此操作的简单方法是使用ksh扩展名(由bash采用)$''来提供可包含反引号的文字字符串。

#!/usr/bin/env bash
string=MYSTRING
regexstring=$'[(][[:space:]]*[\'"]'"$string"$'[\'"]'
grep -e "$regexstring" "$@"

分解这项任务:

$'[(][[:space:]]*[\'"]'

...是一个字符串文字,其计算结果如下:

[(][[:space:]]*['"]

...因此,它匹配单个(,后跟零个或多个空格,后跟'"

它的第二部分是双引号扩展,"$string";这应该是相当直接的。

最后一部分是$'[\'"']';与第一部分一样,$'' string-literal语法用于生成可以包含'"作为内容的字符串。

顺便说一句 - 在POSIX sh中,这可能看起来像:

regexstring='[(][[:space:]]*['"'"'"]'"$string""['"'"]'

在那里,我们使用单引号字符串来保存文字双引号,并使用双引号字符串来保存文字单引号。