Shell Grep需要匹配一个特定的单词
我想在bash脚本中使用grep从一个文件中获取一行,其中只有“version”一词,问题是在我希望脚本查看的文件的下面几行中还有另一行,其中有“dlversion”一词 我将grep管道化到一个cut命令中,输出将保存为一个变量 问题是它要么不保存任何内容到变量中,要么同时保存两行内容,我已经尝试了几种方法,虽然它们都不起作用Shell Grep需要匹配一个特定的单词,shell,unix,grep,Shell,Unix,Grep,我想在bash脚本中使用grep从一个文件中获取一行,其中只有“version”一词,问题是在我希望脚本查看的文件的下面几行中还有另一行,其中有“dlversion”一词 我将grep管道化到一个cut命令中,输出将保存为一个变量 问题是它要么不保存任何内容到变量中,要么同时保存两行内容,我已经尝试了几种方法,虽然它们都不起作用 grep -Fx version /path/to/file.txt | cut -c9- 输出=无 grep '^version$' /path/to/file.t
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 '^version$' /path/to/file.txt | cut -c9-
grep "version" /path/to/file.txt | cut -c9-
输出=两行
也试过
grep -w "version " /path/to/file.txt | cut -c9-
输出=无
grep '^version$' /path/to/file.txt | cut -c9-
grep "version" /path/to/file.txt | cut -c9-
我还尝试自己使用-F,-x,这也导致变量没有值。如果任何复杂的技巧失败,请使用蛮力:通过另一个
grep
过程过滤结果,以过滤掉包含不需要的单词的行(使用-v
选项):
如果任何复杂的技巧失败,请使用蛮力:通过另一个
grep
过程来过滤掉含有不需要的单词的行(使用-v
选项):
根据您的grep版本,您有一些选择 如果支持,最好的选择是使用单词边界
\b
单词的任意一侧:
grep '\bversion\b' /path/to/file.txt
或:
这与“版本”匹配,前面有行首或任何类型的空格或标点
在您的特定情况下,您可以使用以下内容:
grep -E '(^|[^l])version' /path/to/file.txt
这与前面有行开头的“version”或除“l”以外的任何内容相匹配
针对你的评论:
匹配行的开头^
表示“或”|
是一个括号表达式,其中第一个字符的[^l]
表示“not”(因此它匹配除“l”之外的所有字符)^
- 括号用于创建一个组,因此“或”仅适用于模式的这一部分
\b
单词的任意一侧:
grep '\bversion\b' /path/to/file.txt
或:
这与“版本”匹配,前面有行首或任何类型的空格或标点
在您的特定情况下,您可以使用以下内容:
grep -E '(^|[^l])version' /path/to/file.txt
这与前面有行开头的“version”或除“l”以外的任何内容相匹配
针对你的评论:
匹配行的开头^
表示“或”|
是一个括号表达式,其中第一个字符的[^l]
表示“not”(因此它匹配除“l”之外的所有字符)^
- 括号用于创建一个组,因此“或”仅适用于模式的这一部分
cut
更改为从第一个字符开始,然后使用-v
将第一个grep
的输出通过管道传输到第二个-v
过滤掉剩余的字母,效果很好。使用边界可能会对您有所帮助:“\bversion\b”。谢谢,我将剪切
更改为从第一个字符开始,然后使用-v
过滤掉剩余的字母,将第一个grep
的输出通过管道传输到第二个。谢谢!我使用的grep版本不支持边界。不过,你建议的答案奏效了。既然我很好奇,想了解我以后可能会用到的东西,你能解释一下^
和[^l]
的确切功能吗?谢谢!我使用的grep版本不支持边界。不过,你建议的答案奏效了。既然我很好奇,想了解我以后可能会用到的东西,你能解释一下^
和[^l]
到底做了什么吗?