【发布时间】: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