【问题标题】:How to grep strings like this?如何grep这样的字符串?
【发布时间】:2016-05-05 11:35:31
【问题描述】:

字符串:

4b30a444-86c9-4fb8-b5dc-ba721e30fb24    
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc
cc1918be-a532-4ebe-948a-de78cc455fcb
12b6e407-4ec0-4cc6-80d4-b38d7df99694
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee

我试过这些:

egrep [a-z0-9]-[a-z0-9]-[a-z0-9]-[a-z0-9]-[a-z0-9]

egrep '[a-z]{2,}-[a-z]{2,}-[a-z]{2,}-[a-z]{2,}-[a-z]{2,}'

egrep '.-.-.-.-.'

但是什么都没发生

【问题讨论】:

  • 编写一个匹配您想要查找的字符串的正则表达式总是很容易,但编写一个不匹配您不想要的其他字符串的正则表达式要困难得多 (例如.* 匹配您问题中的所有内容,但也匹配其他任何内容)因此编辑您的问题以不仅包括您想要匹配的字符串,还包括它们出现在您输入中的上下文,以便我们可以帮助您提出一个强大的解决方案而不是一个会产生你今天期望的输出然后明天失败的输出。

标签: linux unix text grep find


【解决方案1】:

+ 用于该字符类的 1 个或多个字符,如下所示:

$ egrep '[a-z0-9]+-[a-z0-9]+-[a-z0-9]+-[a-z0-9]+-[a-z0-9]+' data 
4b30a444-86c9-4fb8-b5dc-ba721e30fb24    
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc
cc1918be-a532-4ebe-948a-de78cc455fcb
12b6e407-4ec0-4cc6-80d4-b38d7df99694
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee
$

或使用这样的量词使用固定数量的字符:

$ egrep '[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}' data 
4b30a444-86c9-4fb8-b5dc-ba721e30fb24    
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc
cc1918be-a532-4ebe-948a-de78cc455fcb
12b6e407-4ec0-4cc6-80d4-b38d7df99694
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee

或者您可以将{2,} 用于 2 个或更多字符,如下所示:

$ egrep '[a-z0-9]{2,}-[a-z0-9]{2,}-[a-z0-9]{2,}-[a-z0-9]{2,}-[a-z0-9]{2,}' data 
4b30a444-86c9-4fb8-b5dc-ba721e30fb24    
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc
cc1918be-a532-4ebe-948a-de78cc455fcb
12b6e407-4ec0-4cc6-80d4-b38d7df99694
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee

【讨论】:

    【解决方案2】:

    我推荐 Perl 风格的正则表达式,因为它更接近于我们在编程语言中使用的表达式:

    c='[a-z0-9]'
    grep -P "$c{8}(?:-$c{4}){3}-$c{12}" input.txt
    

    这里我们将重复序列保存到$c shell 变量中。

    • -P 指示 grep 使用 Perl 样式
    • {N} 重复前面的表达式 N
    • (?:) 创建非捕获组以提高效率(我们可能只使用 () 代替)
    • (?:...){3} 重复组内内容 3 次

    【讨论】:

    • 虽然这个答案提供了一个解决方案,但它没有提供任何解释。 Ruslan,您能否添加一些细节来解释为什么这样做有效,以及为什么您认为该解决方案与其他选项相比最好?
    • 已添加说明。
    • 谢谢。唉,加上 Perl 风格,我再次无法投票,因为它使您的答案不可移植。 (BSD 和 OSX 没有 -P。)
    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多