Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么这个grep命令没有带任何东西回来?(猛击)_Regex_Bash_Grep - Fatal编程技术网

Regex 为什么这个grep命令没有带任何东西回来?(猛击)

Regex 为什么这个grep命令没有带任何东西回来?(猛击),regex,bash,grep,Regex,Bash,Grep,我有一个文本文件“samp”,我只想grep以大写元音开头和结尾的行 使用“grep^[AEIOU]samp”有效。 使用“grep[AEIOU]$samp”也可以 但是当尝试将它们组合到“grep^[AEIOU]$samp”时,它不会返回任何结果 三件事: 是的,我在samp中有以大写元音开头和结尾的行 是的,我尝试了我能想到的所有引语组合。没什么了 是的,我是unix新手 您的模式允许一行中只有一个元音。尝试: grep ^[AEIOU].*[AEIOU]$ 请注意,这将不会与单个元音

我有一个文本文件“samp”,我只想grep以大写元音开头和结尾的行

使用“
grep^[AEIOU]samp
”有效。
使用“
grep[AEIOU]$samp
”也可以

但是当尝试将它们组合到“
grep^[AEIOU]$samp
”时,它不会返回任何结果

三件事:

  • 是的,我在samp中有以大写元音开头和结尾的行
  • 是的,我尝试了我能想到的所有引语组合。没什么了
  • 是的,我是unix新手

    • 您的模式允许一行中只有一个元音。尝试:

      grep ^[AEIOU].*[AEIOU]$ 
      
      请注意,这将不会与单个元音的行匹配,如果您也需要,那么我们需要更聪明一些,并使用一些“或”

      您的“组合”示例正在查找由一行上的单个大写元音组成的行!你想要的是:

      grep '^[AIOUE].*[AIOUE]$' samp
      

      你给出的是一个grep,表示正好是1个大写元音的行

      试试这个:

       <cmd> | grep '[AEIOU]$' | grep '^[AEIOU]'
      
      | grep'[AEIOU]$'| grep'^[AEIOU]'
      
      我确信它可以用一个grep来完成,但是我对unix grep不是很熟悉。如果正则表达式与perl类似,那么它就是

       <cmd> | grep '^[AEIOU](.*[AEIOU])?$'
      
      | grep'^[AEIOU](.[AEIOU])?$'
      
      在讨论grep时,Jeffrey Friedl的《掌握正则表达式》第一版在第182页的表6-1中有一个“对一些常见程序风格的初步调查”

      他说“即使是像grep这样简单的东西,变化也很大”

      grep中的正则表达式与Perl不同


      即使带有扩展正则表达式的egrep也不一样,但我发现它更易于使用。

      这将匹配一行,该行只包含任意数量的大写元音(这包括零,因此它匹配空行):

      这匹配仅由一个或多个大写元音组成的行(不匹配空行):


      这两个选项中的任何一个都将匹配只包含一个大写元音的行。

      使用egrep,您可以执行以下操作:

      echo $'hello\nworld' | egrep '^h|d$' 
      

      唯一的问题是它不能匹配一行上只有一个大写元音的行。这更像是一个超级用户类型的问题。@cletus,虽然grep是一个工具,但问题实际上围绕正则表达式(以及各种grep对PCRE的理解程度)。^=行的开始,[AEIOU]=该集合的一个字符,$=行的结束。你有只包含A、E、I、O或U的行吗?我拿出了NPR和BOS标签,尽管我有两个想法。grep和所有其他工具在bash程序中经常使用,不仅仅是命令行中的命令,我更愿意对此表示怀疑。@scrible正如@tster在另一个答案中指出的,您的正则表达式不会匹配一行上正好有一个大写元音的行。我添加了引号,以便bash不会试图处理括号和$符号。也更喜欢第一个,因为对于简单的REs,grep通常更快(即使有两个进程正在运行)。同意,*nix专门通过类似的程序进行管道输出。
      grep -E '^[AEIOU]+$'
      
      echo $'hello\nworld' | egrep '^h|d$'