【问题标题】:Regex is not checking some part of text正则表达式没有检查文本的某些部分
【发布时间】:2018-01-23 08:21:56
【问题描述】:

我有一个示例文件,其中包含要通过 egrep 命令分析的数据:

[IG#]
IG#
[RM#]
RM#
[IG#1234]
[IG# 1234]
[IG #1234] [RM# ]
[IG# 1234] [RM #1224]
[RM#1234]
[RM# 1234]
[RM #1234]
[RM# 1234] [IG#]
[RM# ] [IG#1234]
#1234
1234

我的正则表达式看起来是这样的:

(RM#.*[0-9]|IG#.*[0-9]|\b([A-Z][A-Z0-9]+-[0-9]+)\b)

我不想只找到 [RM# {digits}] AND [IG# {digits}] 的行,但它会像使用 OR 一样返回,结果如下所示:

[IG#1234]
[IG# 1234]
[IG# 1234] [RM #1224]
[RM#1234]
[RM# 1234]
[RM# 1234] [IG#]
[RM# ] [IG#1234]

预期输出是

[IG# 1234]
[RM# 1234]
[IG# 1234] [RM1224]

【问题讨论】:

  • 你的预期输出是什么?
  • @anubhava:我的预期输出是 [RM#] 和 [IG#] 两个部分都包含数字。就这样[IG#1234][RM#1224]
  • | 表示正则表达式中的 OR。
  • umm..为什么预期输出包含[IG# 1234][RM# 1234]
  • 您预期输出中的[IG# 1234] [RM1224] 行似乎是错误的

标签: regex linux syntax grep


【解决方案1】:

看起来您想搜索应该以任意顺序匹配两个不同字符串的行.. 一种方法

$ grep -E 'RM\s*#\s*[0-9]' ip.txt | grep -E 'IG\s*#\s*[0-9]'
[IG# 1234] [RM #1224]
  • \s 将匹配任何空白字符,如果足够则使用文字空间
  • 如果需要,添加额外的约束,例如检查 [] 周围的 RM/IG


要一次性检查,需要创建所有排列

$ grep -E 'RM\s*#\s*[0-9].*IG\s*#\s*[0-9]|IG\s*#\s*[0-9].*RM\s*#\s*[0-9]' ip.txt
[IG# 1234] [RM #1224]

$ # awk is better suited
$ awk '/RM\s*#\s*[0-9]/ && /IG\s*#\s*[0-9]/' ip.txt
[IG# 1234] [RM #1224]

【讨论】:

  • 感谢 Sundeep 的努力 :)
【解决方案2】:

| 是“替代”,即它实际上意味着 OR。正则表达式中没有 AND - 要么列举可能性

egrep 'RM ?# ?[0-9].*IG ?# ?[0-9]|IG ?# ?[0-9].*RM ?# ?[0-9]'

或使用两个 grep

 egrep 'RM ?# ?[0-9]' file | egrep 'IG ?# ?[0-9]'

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多