我想捕获包含恰好 3个字段的所有行,其中字段是任何字符串(可能为空),后跟 |
(并且可能有一些最终的行末尾的文本)。
我设法构建了一个正则表达式
,它似乎完全符合我的要求
^(?:[^\|]*\|){3}[^\|]*$
当我尝试 101regex 时看起来效果很好。
但是,我在通过 grep
在 Windows 命令行上运行此 regex
时遇到问题,我猜这与正确的转义有关。
我试过了
grep -E '^^(?:[^^^\^|]*^\^|){3}[^^^\^|]*$' test.txt
grep -E '^^(?:[^^^|]*^|){3}[^^^|]*$' test.txt
但没有任何帮助。有什么想法吗?
测试输入
0|1|2|3
0|1|2|
|1|2|3
|1|2|
|1|2
|1|
0|1|2
0|1|
|1|2|3|4
|1|2|3|
0|1|2|3|4
0|1|2|3|
最佳答案
在 grep
中,当您使用 POSIX ERE 正则表达式引擎时,需要避免括号表达式和非捕获组中的反斜杠:
grep -E "^([^|]*\|){3}[^|]*$" test.txt
这里,[^\|]
被转换为 [^|]
(因为 POSIX 括号表达式不将转义字符视为正则表达式转义)和 ( ?:
替换为 (
,即该组被设为捕获,因为不支持非捕获组。
查看其有效的证据:
关于regex - 在 Windows 命令行的 Grep 中使用正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61229157/