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
Shell UNIX:使用与grep匹配单引号或双引号的正则表达式_Shell_Grep - Fatal编程技术网

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中的赋值中,=周围不允许有空格。如果您测试的是问题中给出的确切代码,以便实际工作,您就会知道这一点。