如何 grep 空格之间的完整单词

如何 grep 空格之间的完整单词

例如,我有一个像这样的字符串:1341 5415 fdad

命令grep -E "(^|\s)[1-9]{1,5}($|\s)" -o只会给出1341,但我想要得到13415415

我怎样才能做到这一点?

答案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

相关内容