【问题标题】:exclude words if the condition is satisfied如果满足条件,则排除单词
【发布时间】:2022-10-24 12:34:02
【问题描述】:

我有这个文本文件,我想排除“访问”这个词,因为 a 在第二、第三或第四位置后面跟着 a、b 或 c。

# cat tt.txt
access
ample
taxing

我试过这个,但它返回所有 3 个单词。

# grep '[a-c][^a-c][^a-c][^a-c]' tt.txt
access
ample
taxing

更新1:

我在上面使用了过度简化的示例。

# cat tt.txt
access
bccess
ample
taxing
tacking
not

# grep -Ev '[a-c].{0,2}[a-c]' tt.txt
ample
taxing
not

# grep -E '[a-c].{0,2}[^a-c]' tt.txt
access
bccess
ample
taxing
tacking

# Expected
ample
taxing

【问题讨论】:

  • 您需要将您的正则表达式锚定到字符串 ^[a-c][^a-c]{3} 的开头
  • 我敢肯定在某个地方有一个骗局......
  • @shantanuo:请澄清为什么单词not 不应该出现在输出中,因为它不是以[a-c] 开头的单词,[a-z] 从第二到第四位?
  • 因为'not'这个词中没有a,b或c。也许我可以使用 2 个 grep 语句来做到这一点。但这可能适用于实际的文本文件,也可能不适用。
  • 几个问题。 (1)所以你想要:(a)匹配其中带有[a-c]的单词(b)但排除那些在2/3/4位置上[a-c]跟在[a-c]之前的单词(这就是tacking的原因被排除,但taxing 不是)。这个对吗? (2)接受的答案似乎按照要求做......或者由于某种原因它不完全是?还是您只是想要不同的解决方案(以及以哪种方式)?

标签: perl


【解决方案1】:

我想排除 access 这个词,因为 a 后面跟着 abc 在第二、第三或第四位置

可以使用awk 来完成:

awk '/[a-c]/ && !/[a-c].{0,2}[a-c]/' file

ample
taxing

正则表达式细分:

  • [a-c]:匹配 abc
  • .{0,2}:匹配 0 到 2 个任意字符
  • [a-c]:匹配 abc

或者在gnu-grep 中使用环视:

grep -P '^(?=.*[a-c])(?!.*[a-c].{0,2}[a-c])' file

ample
taxing

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多