用grep -oP仅显示符合正则表达式的部分, 每个一行, 特别是在一行中有多个命中的情况

上一篇在blkid的结果中查找UUID时, 

我们把UUID的目标正则表达式设置为

([^-]{8}-[^-]{4}-[^-]{4}-[^-]{4}-[^-]{12}


处理前文本为

/dev/sr0: BLOCK_SIZE="2048" UUID="2023-06-17-04-46-45-00" LABEL="cidata" TYPE="iso9660"
/dev/sda1: UUID="56c6249c-209a-427a-82c8-95a4cbe15687" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="11e06615-bf2f-524a-bd5d-2991360466f2"
/dev/sda15: SEC_TYPE="msdos" UUID="BB09-C166" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="a09b3906-b77a-914f-9a99-46b8f182662f"
/dev/sda14: PARTUUID="997dd1fe-ed57-0a4f-8c21-940577797c9a"

可以看到第1行没有符合要求的, 第2行有2个, 第3行 第4行各有1个.

如果我们用上一篇中的方法使用sed, 

blkid | sed -nr 's/.*([^-]{8}-[^-]{4}-[^-]{4}-[^-]{4}-[^-]{12}).*/\1/gp'

会发现结果只有3个. 



如果我们想用尽量简单的语法来获取正则表达式的字符串的话, 可以使用 grep -oP

blkid | grep -oP '[^-]{8}-[^-]{4}-[^-]{4}-[^-]{4}-[^-]{12}'

这样会把全部符合条件的都显示出来, 一共4个, 每行1个.



评论

The Hot3 in Last 30 Days

RackNerd VPS搭V2Ray WSS梯子 年付 $10.98 1G端口 3T流量 17G存储 1GB内存