我想匹配一个正则表达式,其字符串一部分包含在一个变量中:的grep一个字符串变量和正则表达式
matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt`
在正则表达式,将意味着“在任何phonelist.txt线它以命令行参数开头,后跟一个空格和一个任意数字的数字“。已经尝试了很多东西,但似乎无法得到它。 帮助
我想匹配一个正则表达式,其字符串一部分包含在一个变量中:的grep一个字符串变量和正则表达式
matches=`grep "^"$*"[ ][0-9]\{1,\}" --count phonelist.txt`
在正则表达式,将意味着“在任何phonelist.txt线它以命令行参数开头,后跟一个空格和一个任意数字的数字“。已经尝试了很多东西,但似乎无法得到它。 帮助
我想你应该尝试:
IFS=" "
matches=$(grep "^$* [0-9]\+" --count phonelist.txt)
bash的手册页说:$*
“扩展为一个词与分离的每一个参数的值通过IFS
特殊变量的第一个字符“[email protected]
”,每个参数扩展为一个单独的单词,即“[email protected]
”相当于“$ 1”“$ 2”...“。 在您的正则表达式中,您将需要将所有参数合并为一个单词。
这给一试:
matches=$(grep "^$* [0-9]\+" --count phonelist.txt)
给出了'grep:iygfiyhgv [0-9] \ +:当用参数调用时没有这样的文件或目录':iygfiyhgv。 – 2011-03-21 03:39:05
@Mr_and_Mrs_D:这是其中需要'$ *'而不是'$ @'的实例之一。对困惑感到抱歉。请尝试修改后的版本。 – 2011-03-21 10:22:56
''grep --count'^ $ * [0-9] \ +“phonelist.txt''我用 - 似乎工作(会测试更多)。 – 2011-03-21 22:26:47
如果你要正确对待每个命令行参数作为一个单独的模式(即你希望有一个“匹配”,如果符合的命令行参数的任何开始),那么你可以构建这样你整个扩展正则表达式:
^(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值不会“转义”到脚本的后面部分。
会在我回家后回来检查它 - 我确实需要所有参数(它们将在电话列表中形成名称,可以是_john_或_wolfgang amadeus mozart_的任意长/短) – 2011-03-21 10:18:46
如果您计划传递个人姓名组件作为单独的参数,那么你会希望其他答案显示的方法(只是'$ *'而不是'IFS = \ |'和'($ *)')。我的答案是,如果你想写'脚本'wolfgang amadeus mozart''johann sebastian bach''(引用多词的名称,所以他们进入单一的参数和多个参数提供替代字符串(模式,真的)匹配) 。 – 2011-03-21 11:09:44
谢谢 - 将它检查回家 - 不幸的是我的远程外壳说IFS:未定义的变量,但会检查这一点 - 编辑:是tsch。 – 2011-03-21 21:42:00
为什么'IFS =“”'部分? – 2011-03-21 22:29:24
在'bash'(我预计会使用它)控制'$ *'的扩展中'IFS =“”'是必需的。这意味着'$ *'的所有元素都被连接成一个字符串,用“”分隔。 “IFS”表示“内部字段分隔符”。 – bmk 2011-03-22 10:02:46