【问题标题】:Regular expression Unix shell script正则表达式 Unix shell 脚本
【发布时间】:2009-11-01 12:52:59
【问题描述】:

我需要过滤所有以字母开头的单词,后跟零个或多个字母或数字,但没有特殊字符(基本上可以用于 c++ 变量的名称)。

egrep  '^[a-zA-Z][a-zA-Z0-9]*'

这适用于诸如“a”、“ab10”之类的词,但它也包括诸如“b.b”之类的词。我知道表达式末尾的 * 是问题。如果我将 * 替换为 +(一个或多个),它会跳过仅包含一个字母的单词,所以它没有帮助。

编辑: 我应该更准确。如上所述,我想找到具有任意数量的可能单词的行。这是一个例子:

int = 5;
cout << "hello";
//some comments

在这种情况下,它应该打印上面的所有行,因为它们都包含至少一个符合所描述条件的单词,并且行不必以字母开头。

【问题讨论】:

  • 这里的一个问题是 ^ 指的是一行的开头,但是您对包含单词的任何行感兴趣。我建议进行修改。

标签: shell scripting


【解决方案1】:

您的解决方案大致类似于此示例。在这种情况下,正则表达式要求“单词”前面有空格或行首,然后是空格或行尾。您将需要根据需要修改边界要求(括号中的内容)。

'(^| )[a-zA-Z][a-zA-Z0-9]*( |$)'

【讨论】:

    【解决方案2】:

    假设该行在单词之后结束:

    '^[a-zA-Z][a-zA-Z0-9]+|^[a-zA-Z]$'
    

    【讨论】:

    • 我不知道你可以在正则表达式中使用“OR”。这使它变得容易得多。谢谢。
    【解决方案3】:

    你必须添加一些东西。可能其余部分可以是空格,或者您可以只附加行尾。(AFAIR 它是 $ )

    【讨论】:

      【解决方案4】:

      您的问题在于 ^$ 锚分别匹配行的开头和结尾。如果它确实包含一个单词,您希望该行匹配,摆脱锚点可以满足您的需求:

      egrep  '[a-zA-Z][a-zA-Z0-9]+'
      

      请注意,+ 匹配长度为 2 或更高的单词,* 在那个位置也会标记字符。

      【讨论】:

        猜你喜欢
        • 2014-10-17
        • 1970-01-01
        • 2019-03-27
        • 2016-06-06
        • 1970-01-01
        • 2012-01-25
        • 2010-12-10
        • 1970-01-01
        • 2015-07-15
        相关资源
        最近更新 更多