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

a weird string match issue using $ and 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}

提前致谢, 林

grep 中的 * 运算符不同于 shell.

中使用的 globbing 运算符

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

要获得等同于 shell 通配符的运算符,您必须在 grep 中使用 .*。表示任何字符的零次或多次重复(. 是任何字符的运算符)

请注意,采用这种方法很可能您仍然不匹配您要查找的内容,因为 grep 会贪婪地匹配并将 {"Foo":123,"Goo":456}{"Foo":234,"Goo":567}{"Foo":345, 作为 Foo.*.[=24 的匹配项=]

您可能想用 Foo[^,]*, 之类的东西来解决这个问题。

另请注意,如果不是打字错误,给出的命令行中的 $ 是完全无用的,命令与 grep -o "Foo*" grepdebugtest.txt

相同

对 JSON 数据使用 JSON 解析器:

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