Shell UNIX:使用与grep匹配单引号或双引号的正则表达式
我有话要说Shell UNIX:使用与grep匹配单引号或双引号的正则表达式,shell,grep,Shell,Grep,我有话要说 string="MYSTRING" 现在,我想用双引号对MYSTRING的任何出现进行grep,这样在开始时就必须有括号,基本上我想搜索,其中MYSTRING被用作函数的参数。所以 foo( "MYSTRING" //postive foo("MYSTRING" //positive foo('MYSTRING' //positive foo( 'MYSTRING' //positive var a = "MYSTRING" //negativ
string="MYSTRING"
现在,我想用双引号对MYSTRING的任何出现进行grep,这样在开始时就必须有括号,基本上我想搜索,其中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
理想情况下,所有项目旁边都有正值,而没有一个项目与负值相匹配。要做到这一点,需要做哪些更改?简单的方法是使用bash$采用的ksh扩展来提供一个可以包含反勾号的文本字符串
#!/usr/bin/env bash
string=MYSTRING
regexstring=$'[(][[:space:]]*[\'"]'"$string"$'[\'"]'
grep -e "$regexstring" "$@"
分解此任务:
$'[(][[:space:]]*[\'"]'
…是一个字符串文字,其计算结果如下:
[(][[:space:]]*['"]
…因此,它匹配一个空格,后跟零个或多个空格,后跟“或”
它的第二部分是双引号扩展,$string;这应该是相当直率的
最后一部分是$'[\''];与第一部分一样,$string literal语法用于生成一个字符串,该字符串可以同时包含“和”内容
顺便说一句,在POSIX sh中,这可能看起来像:
regexstring='[(][[:space:]]*['"'"'"]'"$string""['"'"]'
在这里,我们使用单引号字符串来保存文字双引号,双引号字符串来保存文字单引号。@CharlesDuffy:我更正了我的问题陈述。请现在查看并删除downvote。regexstring=[]*\$string\仍然是无效语法,不会实际运行赋值。grep-rn$regexString仍然不正确,这将导致报告。我们想要一个问题对一个问题-如果有其他错误阻止代码执行的问题,这是次优的。也就是说,在理想的世界中,我们可以直接复制和粘贴您的问题中的代码,并查看您当前的输出。描述当前输出与预期输出之间的差异也是一个需要的组件。我测试了regexstring=[]\$string\。这是有效的。我需要两方面的帮助:第一:如何确保$string和开头之间有空格;第二:如何在前后有单引号或双引号。请帮忙。不,这是无效的。regexstring=[]\$string\将regexstring作为命令运行,并将=作为其第一个参数;在shell中的赋值中,=周围不允许有空格。如果您测试的是问题中给出的确切代码,以便实际工作,您就会知道这一点。