【问题标题】:egrep not removing special charactersegrep 不删除特殊字符
【发布时间】:2014-05-04 20:36:08
【问题描述】:

我遇到了 egrep 问题,它似乎省略了 !@#% 等特殊字符。

目标是删除具有超过 3 个完全相同字符的行。角色不需要一个一个一个一个。

111!!!qqq! #should be removed because has 4 '!'
!1!1!opop  #is fine

这是我正在使用的:

cat file1.txt | egrep -vi "^(.*)(.{3,})(.*)\2(.*)$" > file2.txt

它适用于非特殊字符,但它不会删除像 !!!qwqwqwq! 这样的文件。

提前致谢。

【问题讨论】:

  • 我真的不认为这是指向特殊字符的链接......你能提供你的测试用例吗?你想将正确的行只打印到file2,还是不正确的行?

标签: regex linux grep


【解决方案1】:

你也可以使用awk来解决这个问题:

awk '{delete a;for (i=1;i<=NF;i++) if (++a[$i]>3) next}1' FS="" file
!1!1!opop

通过设置FS="",循环将针对该行中的每个字符运行。
然后它将它存储在一个名为 a 的数组中,并对其进行递增并测试它是否大于 3
如果它更大,则使用next 跳到下一行。如果没有跳过,1 将打印它。

【讨论】:

    【解决方案2】:

    使用这个:

    cat input.txt | egrep -vi "(.).*\1.*\1.*\1"
    

    (.)是捕获任意一个字符,然后检查是否有三个相同的字符(在\1)在next中。

    【讨论】:

    • 注意egrep ... input.txt直接可以,不需要cat。
    • 这应该缩短为:egrep '(.)(.*\1){3}' input.txt
    • 您不应发布使用cat 将数据输入可自行读取的程序的示例。
    • @Jotne 我只更正了 OP 的正则表达式。我知道基本的 linux 命令,但没有你们那么强大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多