【问题标题】:grep pipe searching for one word, not linegrep 管道搜索一个单词,而不是行
【发布时间】:2014-01-01 07:22:43
【问题描述】:

由于某种原因,我不能让它只输出这一行的版本。我怀疑这与 grep 如何解释破折号有关。

这个命令:

admin@DEV:~/TEMP$ sendemail

产生以下结果:

Brandon Zehm 的 sendemail-1.56
下面省略更多输出

第一行很有趣。我正在尝试将版本存储到变量中。

TESTVAR=$(sendemail | grep '\s1.56\s')

有人看到我做错了吗?谢谢

TESTVAR 只是空的。即使没有 TESTVAR,输出也是空的。

我也尝试了以下方法,认为这可能有效。

sendemail | grep '\<1.56\>'

我刚刚在编辑时又试了一次,我想我还有另一个问题。也许我没有正确处理输出。它输出整行,但我可以看到 grep 正在找到 1.56,因为它在行中突出显示了它。

【问题讨论】:

    标签: bash grep pipe


    【解决方案1】:
    $ TESTVAR=$(echo 'sendemail-1.56 by Brandon Zehm' | grep -Eo '1.56')
    $ echo $TESTVAR
    1.56
    

    重点是grep -Eo '1.56'

    来自grep man页面:

       -E, --extended-regexp
              Interpret PATTERN as an extended regular expression (ERE, see below).  (-E is specified by POSIX.)
    
       -o, --only-matching
              Print  only  the  matched (non-empty) parts of a matching line, with each such part on a separate output
              line.
    

    【讨论】:

    • 刚刚意识到你可以省略-E
    【解决方案2】:

    您的正则表达式与版本的形式不匹配。您已指定版本被空格包围,但在它前面有一个破折号。

    将第一个 \s 替换为大写形式 \S 或明确的字符集,它应该可以工作。

    【讨论】:

    • 奇怪。确保 sendemail 将该信息输出到 STDOUT(可能是 STDERR)。
    【解决方案3】:

    我想知道:在您的示例中,您似乎知道版本(因为您 grep 为它),所以您可以将版本字符串分配给变量。我假设您想在那里获取任何(未知)版本字符串。 sed 中的正则表达式可以是(使用 POSIX 字符类):

    sendemail |sed -n -r  '1 s/sendemail-([[:digit:]]+\.[[:digit:]]+).*/\1/ p'
    

    -n 抑制了每一行的正常默认输出; -r 启用扩展正则表达式;前导 1 告诉 sed 仅在第 1 行工作(我假设版本出现在第一行)。我将版本号锚定到告示字符串sendemail-,以便该行中其他地方的潜在其他数字不匹配。如果程序名称更改或连字符在未来的版本中消失,这将不再匹配。

    上面的 grep 解决方案和这个解决方案都存在阅读整个输出的缺点,这可能很长(就像现在的电子邮件一样)。此外,grep 会在程序的输出中找到包含该模式的所有其他行(如果它确实是电子邮件,有人可能会在其中讨论这个问题,并提供示例!)。如果它确实是第一行,那么首先通过head -1 进行管道传输将是高效且谨慎的。

    【讨论】:

      【解决方案4】:
      jayadevan@jayadevan-Vostro-2520:~$ echo $sendmail
      sendemail-1.56 by Brandon Zehm
      jayadevan@jayadevan-Vostro-2520:~$ echo $sendmail | cut -f2 -d "-" | cut -f1 -d" "
      1.56
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 2020-01-21
        • 1970-01-01
        相关资源
        最近更新 更多