【问题标题】:Using grep to find matches of a string without a specific character at the end使用 grep 查找末尾没有特定字符的字符串的匹配项
【发布时间】:2016-02-26 15:42:12
【问题描述】:

我正在尝试使用 grep 来查找特定字符串的非复数实例。

例如,我想查找“string”的所有实例,但忽略“strings”的所有实例。

我该怎么做?

编辑:我确实想找到后面跟着其他字符的实例。我实际上只需要省略以's'结尾的那些

【问题讨论】:

  • 为了让回答者可以很容易地找出你的问题,请举一些预期结果的例子。
  • 你应该去掉关于查找非复数的文本,因为在octupus/octopi、bus/busses`和sheep/sheep这样的情况下,这是一个非常困难的问题。只需将您的问题集中在您想要的内容上 - 删除以 s 结尾的单词,例如,bus 即使单数也会被删除,octopi 即使复数也会保留。

标签: regex grep


【解决方案1】:

您可以在grep 中使用单词边界:

grep '\<string\>' file

例子:

# with word boundaries
grep '\<string\>' <<< $'string\nstrings'
string

# without word boundaries
grep 'string' <<< $'string\nstrings'
string
strings

编辑:基于以下 cmets,您可以使用:

grep -E '\<string([^s]|$)' file

示例:

grep -E '\<string([^s]|$)' <<< $'string\nstrings'
string

【讨论】:

  • 棘手的事情(抱歉不清楚)是我正在寻找特殊字符。这是在 python 脚本中,所以我正在寻找具有冒号、左括号、换行符等的实例。我实际上只需要省略以 's' 结尾的实例
  • 是的!非常感谢
【解决方案2】:

您可以使用\b 匹配a word boundary。希望这会有所帮助:

[root@rh57quinn ~]# echo 'find instances of a particular string - any "string", but leave out "strings" and drawstring' |grep -Eo '\bstring\b'
string
string

【讨论】:

    【解决方案3】:

    如果你使用通用的grep,你可以这样做

    echo "stringsMystring1string2strings" | grep -Eo 'strings?' | grep -Eo '^string$'
    

    这个想法是您只需首先使用模式stringstrings 列出所有字符串,by

    命令:

    `grep -Eo 'strings?'`
    

    结果:

    strings
    string
    string
    strings
    

    grep 再次得到结果

    命令:

    grep -Eo '^string$'
    

    结果:

    string
    string
    

    根据regex-lookahead-for-not-followed-by-in-grep,有人建议使用GNU grep,您可以使用-P--perl-regexp 选项来启用lookaround 功能。给定的正则表达式可能采用这样的形式

    echo "stringsMystring1string2strings" | grep -P 'string(?!s)'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多