grep,带有字符串变量和正则表达式

时间:2011-03-21 03:16:04

标签: regex bash grep

我正在尝试匹配一个正则表达式,其字符串部分包含在变量中,如:

matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt`

其中正则表达式是指“phonelist.txt中的任何行,它以命令行参数开头,后跟空格和任意多位数字”。尝试了很多东西,但似乎无法得到它。 帮助

3 个答案:

答案 0 :(得分:2)

尝试一下:

matches=$(grep "^$* [0-9]\+" --count phonelist.txt)

答案 1 :(得分:2)

如果要将每个命令行参数视为单独的模式(即,如果一行以任何命令行参数开头,则需要“匹配”),那么您可以构建整个扩展像这样的正则表达式:

^(arg1|arg2|arg3|...) [0-9]+

您可以将set IFS用于|并使用$*自动将您的位置参数扩展为该表单,如下所示:

(IFS=\|; echo "^($*) [0-9]+")

括号形成一个子shell,以便更改的IFS仅限于括号中的命令(您可能不希望该设置影响脚本的后续部分。

使用包含扩展正则表达式元字符的命令行参数时,您需要小心。例如,如果要搜索文字字符串foo(bar),则需要传递foo\(bar\)之类的参数作为参数(与文字字符串匹配的ERE),您可以将其写为{{ 1}}在一个实际的命令行上。

最后,将其放回原始命令并告诉'foo\(bar\)'期望扩展的正则表达式(grep):

-E

命令替换matches=$(IFS=\|; grep -E "^($*) [0-9]+" --count phonelist.txt) 实际上是它自己的子shell,因此修改后的IFS值不会“逃逸”到脚本的后续部分。

答案 2 :(得分:1)

我认为你应该尝试:

IFS=" "
matches=$(grep "^$* [0-9]\+" --count phonelist.txt)

bash的手册页说:$*“扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔,而$@”每个参数扩展为一个单独的单词。也就是说,“$@”相当于“$ 1”“$ 2”......“。 在正则表达式中,您需要将所有参数合并为一个单词。