2011-03-21 103 views
2

我想匹配一个正则表达式,其字符串一部分包含在一个变量中:的grep一个字符串变量和正则表达式

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

在正则表达式,将意味着“在任何phonelist.txt线它以命令行参数开头,后跟一个空格和一个任意数字的数字“。已经尝试了很多东西,但似乎无法得到它。 帮助

回答

1

我想你应该尝试:

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

bash的手册页说:$*“扩展为一个词与分离的每一个参数的值通过IFS特殊变量的第一个字符“[email protected]”,每个参数扩展为一个单独的单词,即“[email protected]”相当于“$ 1”“$ 2”...“。 在您的正则表达式中,您将需要将所有参数合并为一个单词。

+0

谢谢 - 将它检查回家 - 不幸的是我的远程外壳说IFS:未定义的变量,但会检查这一点 - 编辑:是tsch。 – 2011-03-21 21:42:00

+0

为什么'IFS =“”'部分? – 2011-03-21 22:29:24

+0

在'bash'(我预计会使用它)控制'$ *'的扩展中'IFS =“”'是必需的。这意味着'$ *'的所有元素都被连接成一个字符串,用“”分隔。 “IFS”表示“内部字段分隔符”。 – bmk 2011-03-22 10:02:46

2

这给一试:

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

给出了'grep:iygfiyhgv [0-9] \ +:当用参数调用时没有这样的文件或目录':iygfiyhgv。 – 2011-03-21 03:39:05

+0

@Mr_and_Mrs_D:这是其中需要'$ *'而不是'$ @'的实例之一。对困惑感到抱歉。请尝试修改后的版本。 – 2011-03-21 10:22:56

+0

''grep --count'^ $ * [0-9] \ +“phonelist.txt''我用 - 似乎工作(会测试更多)。 – 2011-03-21 22:26:47

2

如果你要正确对待每个命令行参数作为一个单独的模式(即你希望有一个“匹配”,如果符合的命令行参数的任何开始),那么你可以构建这样你整个扩展正则表达式:

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

您可以使用set IFS来|和使用$*自动扩展您的位置参数到这种形式是这样的:

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

霸租借形式为子外壳,以便更改后的IFS仅限于括号中的命令(您可能不希望该设置影响脚本的后续部分。

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

最后,把它放回原来的命令,并告诉grep期望扩展正则表达式(-E):

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

命令替换$()实际上是它自己的子shell,所以修改后的IFS值不会“转义”到脚本的后面部分。

+0

会在我回家后回来检查它 - 我确实需要所有参数(它们将在电话列表中形成名称,可以是_john_或_wolfgang amadeus mozart_的任意长/短) – 2011-03-21 10:18:46

+0

如果您计划传递个人姓名组件作为单独的参数,那么你会希望其他答案显示的方法(只是'$ *'而不是'IFS = \ |'和'($ *)')。我的答案是,如果你想写'脚本'wolfgang amadeus mozart''johann sebastian bach''(引用多词的名称,所以他们进入单一的参数和多个参数提供替代字符串(模式,真的)匹配) 。 – 2011-03-21 11:09:44