使用 $ 和 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
迷路了为什么在匹配模式中添加另一个,它不能匹配任何东西?我想要实现的是在每条记录中提取 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.
在 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