我想在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,这也导致变量没有值。
答案 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”以外的每个字符匹配)。