【问题标题】:using Regex and linux commands(grep or egrep?) to find specific strings使用 Regex 和 linux 命令(grep 或 egrep?)查找特定字符串
【发布时间】:2015-03-21 03:37:30
【问题描述】:

注意:我不确定我的正则表达式是否正确,因为我在学校的教科书没有解释/教授这种形式的正则表达式,而只解释/教授数学形式,例如 DFA/NFA

如果有任何建议或提示,我将不胜感激

问题:

(a) 查找文本中所有出现的以“a”开头并以“e”结尾的三个字母的单词;

(b) 查找文本中所有以“m”开头并以“r”结尾的单词;

我的方法:

a)^[a][a-zA-Z][e]$(如何区分3个字母的单词和所有的单词?)

b)^[m][a-zA-Z][r]$

我也想在 linux 中使用这些正则表达式,所以下面的命令可以工作吗?:

grep '^[a][a-zA-Z][e]$' 'usr/dir/.../text.txt'

或者我应该以这种方式使用 egrep:

find . -text "*.txt" -print0 | xargs -0 egrep '^[a][a-zA-Z][e]$'

【问题讨论】:

    标签: regex linux grep


    【解决方案1】:

    您可以在两个匹配项中使用grep -w 交替正则表达式:

    grep -w 'a[a-zA-Z]e\|m[a-zA-Z]*r' file.txt
    

    【讨论】:

    • 从来不知道-w。不错!
    【解决方案2】:

    您可以使用单词边界\b来匹配单词的开头和结尾:

    a) 查找文本中所有出现的以“a”开头并以“e”结尾的三个字母的单词;

    grep -o '\ba[a-zA-Z]e\b'
    

    该模式匹配单词边界,然后是后面的a、单个字符和后面的e 以及单词边界。

    b) 查找文本中所有以“m”开头并以“r”结尾的单词;

    grep -o '\bm[a-zA-Z]*r\b'
    

    模式匹配单词边界、m 零个或多个字符(通过 * 量词)、r 和单词边界。


    此外,我使用-o 选项,它在自己的行上输出每个匹配项,而不是输出包含匹配项的整行输入。


    顺便说一句,感谢 -w 选项 - 仅匹配整个单词 - 您甚至可以将上述模式简化为:

    一)

    grep -wo 'a[a-zA-Z]e'
    

    和 b)

    grep -wo 'm[a-zA-Z]*r'
    

    感谢@anubhava!


    您要求egrepegrep 无法帮助简化或优化模式。 grep 绝对没问题。

    【讨论】:

    • 如何在我想要的文件上使用它?该文件是 text.txt 所以应该是 grep -oi '\ba[a-z]e\b' /cs/dept/course/2014-15/W/201/text.txt ?
    • 好吧,这很奇怪,当我使用命令“grep -oi '\ba[a-z]e\b' text”时它不会抛出任何错误,但是当我输入它时没有任何反应。跨度>
    • 文本中根本找不到第一个模式。第二个模式找到 3 次出现的 microcomputer。在文本中添加单词are,第一个命令会找到它。
    • 刚刚检查过,看起来它正在工作,感谢您的帮助。也感谢其他人发布答案。
    • 很好解释的答案+1
    【解决方案3】:

    在您的示例中,您只会匹配包含三个字符的整行,匹配您期望的字母。

    “^”表示行首

    “$”表示行尾

    为了只提取三个字母的单词,您必须匹配一些空格。例如 grep ' a[a-Z]e ' 'usr/dir/.../text.txt'

    但是,这会丢失行首或行尾的所有三个字母单词的实例

    here is an issue using egrep and grep to match whitespace/start of line

    【讨论】:

      【解决方案4】:

      首先,egrep 扩展为grep,与使用选项-E 调用grep 相同。其次,在许多情况下,您不需要使用findxargs,因为-r 选项将在指定路径内的文件中递归搜索。

      您的正则表达式适合grep 支持的基本(非扩展)正则表达式语言,因此不需要egrep

      我会把它简化为

      grep -r '^a[a-zA-Z]e$' /usr/share/dict/
      

      还有这个

      grep -r '^m[a-zA-Z]*r$' /usr/share/dict/
      

      【讨论】:

        猜你喜欢
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多