我正在尝试匹配一个正则表达式,其字符串部分包含在变量中,如:
matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt`
其中正则表达式是指“phonelist.txt中的任何行,它以命令行参数开头,后跟空格和任意多位数字”。尝试了很多东西,但似乎无法得到它。 帮助
答案 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”......“。
在正则表达式中,您需要将所有参数合并为一个单词。