使用$和grep的一个奇怪的字符串匹配问题

时间:2015-05-04 23:58:00

标签: regex grep

迷失为什么添加另一个,在匹配模式中,它无法匹配任何东西?我想要实现的是在每个记录中提取Foo的值,即123,234和345。

grep -o $"Foo*" grepdebugtest.txt
Foo
Foo
Foo

grep -o $"Foo*," grepdebugtest.txt

(match nothing)

cat grepdebugtest.txt
{"Foo":123,"Goo":456}{"Foo":234,"Goo":567}{"Foo":345,"Goo":678}
提前谢谢, 林

2 个答案:

答案 0 :(得分:1)

grep中的*运算符与shell中使用的globbing运算符不同。

在grep中Foo*,表示前一个字符重复零次或多次。您的模式Foo,Foooooo, Fo,甚至Foo":123,匹配,但从不.*

要获得shell globbing运算符的等价物,必须在grep中使用.。意味着零个或多个重复的任何字符({"Foo":123,"Goo":456}{"Foo":234,"Goo":567}{"Foo":345,是任何字符的运算符)

注意,采用这种方法很可能你仍然不匹配,你正在寻找什么,因为grep会匹配贪婪并将Foo.*作为Foo[^,]*,的匹配。

您可能希望绕过与$等匹配的问题。

另请注意,如果它不是拼写错误,则命令行中的grep -o "Foo*" grepdebugtest.txt无用且命令与<script type="text/javascript"> function doGet(){ $.get('lastactivity.php'); } $(document).ready(function(){ var refreshId = setInterval(doGet,10000); }); </script>

相同

答案 1 :(得分:1)

在JSON数据上使用JSON解析器:

jq '.Foo' <<END
{"Foo":123,"Goo":456}{"Foo":234,"Goo":567}{"Foo":345,"Goo":678}
END
123
234
345