出于某种原因,我不能让它只输出这一行的版本。我怀疑它与grep如何解释破折号有关。
此命令:
admin@DEV:~/TEMP$ sendemail
产生以下内容:
sendemail-1.56 by Brandon Zehm
下面的更多输出省略了
第一行感兴趣。我正在尝试将版本存储到变量。
TESTVAR=$(sendemail | grep '\s1.56\s')
有谁看到我做错了什么?感谢
TESTVAR只是空的。即使没有TESTVAR,输出也是空的。
我也试过以下,认为这可能会奏效。
sendemail | grep '\<1.56\>'
我刚刚尝试过,编辑时我觉得还有另外一个问题。也许我没有正确处理输出。它输出整行,但我可以看到grep找到了1.56,因为它在行中突出显示它。
答案 0 :(得分:2)
$ 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.
答案 1 :(得分:1)
您的正则表达式与版本的形式不匹配。你已经指定版本被空格包围,但在它前面你有一个破折号。
将第一个\s
替换为大写形式\S
或明确的字符集,它应该有用。
答案 2 :(得分:1)
我想知道:在你的例子中,你似乎知道版本(因为你grep它),所以你可以只将版本字符串分配给变量。我假设你想在那里获得任何(未知)版本字符串。 sed中的正则表达式可以是(使用POSIX字符类):
sendemail |sed -n -r '1 s/sendemail-([[:digit:]]+\.[[:digit:]]+).*/\1/ p'
-n
抑制每行的正常默认输出; -r
启用扩展的正则表达式;前导1告诉sed只能在第1行工作(我假设版本出现在第一行)。我将版本号锚定到告警字符串sendemail-
,以便该行中其他位置的潜在其他数字不匹配。如果程序名称在将来的版本中更改或连字符消失,那么这将不再匹配。
上面的grep解决方案和这个解决方案都有缺点,读取整个输出(如今电子邮件)可能很长。另外,grep会在程序的输出中找到包含模式的所有其他行(如果它确实是电子邮件,有人可能会用它们来讨论这个问题!)。如果它确实是第一行,那么首先通过head -1
进行管道将是高效和谨慎的。
答案 3 :(得分:0)
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