例如,我有一个像这样的字符串:1341 5415 fdad
。
命令grep -E "(^|\s)[1-9]{1,5}($|\s)" -o
只会给出1341
,但我想要得到1341
和5415
。
我怎样才能做到这一点?
答案1
echo '1341 5415 fdad' | grep -E -o '\b[1-9]{1,5}\b'
输出:
第1341章 5415
-E
:将 PATTERNS 解释为扩展正则表达式
-o
:仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
\b
:零宽度字边界
答案2
您得到的实际匹配是1341␣
,带有尾随空格。 grep 不会查找重叠的匹配项,因此当第一个匹配项占用该空格时,该模式不会在该行的其余部分再次匹配。但如果输入是123 456 789
,则两个字符串123␣
和␣789
将会匹配。
它可能更容易使用grep -w
:
-w
,--word-regexp
仅选择包含构成整个单词的匹配项的行。测试是匹配的子字符串必须位于行的开头,或者前面有一个非单词组成字符。
$ echo '1341 5415 fdad' | grep -wE "[1-9]{1,5}" -o
1341
5415
或者,您可以将 grep 之前的所有空格加倍:
$ echo '1341 5415 fdad' | sed -e 's/ / /g' | grep -E "(^|\s)[1-9]{1,5}($|\s)" -o
1341
5415
(或者sed -e 's/\s/ /g'
如果这在你的 sed 中有效的话。)
行中有一个尾随空格1341
,并且 中有一个前导空格5415
,这些都是匹配的一部分。
答案3
一种方法是将所有空格更改为换行符,然后用于grep -x
选择与表达式完全匹配的行:
$ echo '1341 5415 fdad' | tr -s '[:space:]' '[\n*]' | grep -xE -e '[1-9]{1,5}'
1341
5415