Grep需要匹配特定的单词

时间:2016-03-30 12:22:26

标签: shell unix grep

我想在bash脚本中使用grep来获取文件中只包含单词“version”的行,问题是我希望脚本在那里看到的文件中有几行下行另一行用“dlversion”这个词排成一行。

我将grep传递给cut命令,输出将保存为变量

问题在于它既不会保存任何内容,也不会保存两行,我已经尝试了几种方法,但是没有一种方法可以使用。

grep -Fx version /path/to/file.txt | cut -c9-

输出=没有

grep '^version$' /path/to/file.txt | cut -c9-

输出=没有

grep "version" /path/to/file.txt | cut -c9-

输出=两行

也尝试了

grep -w "version " /path/to/file.txt | cut -c9-

输出=没有

我也试图自己使用-F,-x,这也导致变量没有值。

2 个答案:

答案 0 :(得分:1)

如果任何复杂的技巧失败,请使用暴力:通过另一个grep进程管道结果以过滤掉含有不需要的单词的行(使用-v选项):

grep 'version' sourcefile | grep -v 'dlversion' > destination

答案 1 :(得分:1)

您有几个选项,具体取决于您的grep版本。

如果支持,最好的选择是在单词的任一侧使用单词边界\b

grep '\bversion\b' /path/to/file.txt

或者:

grep '\<version\>' /path/to/file.txt

\<\>分别匹配单词开头和结尾的空字符串。

否则,您可以创建自己认为不是单词的字符集:

grep -E '(^|[[:space:][:punct:]])version' /path/to/file.txt

这匹配“版本”,前面是行的开头或任何类型的空格或标点符号。

在您的具体情况下,您可以使用以下内容:

grep -E '(^|[^l])version' /path/to/file.txt

这匹配“行”开头之前的“版本”或“l”以外的任何内容。

回应你的评论:

  • ^匹配该行的开头。
  • |表示“或”。
  • [^l]是一个括号表达式,其中^作为第一个字符表示“不”(因此,这与“l”以外的每个字符匹配)。
  • 括号用于创建一个组,因此“或”仅适用于该模式的这一部分。