bash:在 shell 脚本中使用正则表达式查找和 grep
Posted
技术标签:
【中文标题】bash:在 shell 脚本中使用正则表达式查找和 grep【英文标题】:bash: find and grep with regex in shellscript 【发布时间】:2022-01-13 18:41:18 【问题描述】:我安装了某个软件的多个版本(我们称之为MySoftware),我喜欢通过find
和grep
的组合找到特定版本的路径。
假设我有以下版本:
1.12.0
1.12.2
1.42.2
存储方式如下:
~/src/MySoftware/1.12.0/...
~/src/MySoftware/1.12.2/...
~/src/MySoftware/1.42.2/...
在 shell 中,我可以执行 find . -name MySoftware | grep 1.12.0
之类的操作。这是有效的,因为命令给了我 ~/src/MySoftware/1.12.0/
路径。
但是,当切换到 shell 脚本时,我尝试这样做:
find . -name "MySoftware" -exec grep "1\.12\.0" ';'
然而,上面的例子没有返回任何东西,我不知道为什么。 grep -HF "1.12.0"
的其他尝试也不起作用。我很感激任何建议
【问题讨论】:
您的文件MySoftware
包含字符串1.12.0
?
@Cyrus:是的,抱歉,不清楚。我改成文字了
鉴于问题中的目录结构,我无法理解命令find . -name MySoftware | grep 1.12.0
如何给出~/src/MySoftware/1.12.0/
【参考方案1】:
请注意区别!
在第一个示例中,find . -name MySoftware | grep 1.12.0
您正在构建一个包含文件名称的列表,然后您 grep 特定版本。
但是,在第二个示例中,您正在尝试查找相同的文件并且您正在尝试在这些文件中进行 grep!!!
所以,有了这个:
find . -name "MySoftware" -exec grep "1\.12\.0" ';'
你正在那些文件中搜索!!!
我建议你这样做:
find . -type f -name "MySoftware" | grep 1.12.0
【讨论】:
非常感谢。那是有效的。此解决方案是在结果前面添加术语(standard input):
。有没有办法不这样做?我想在变量中使用它以进行进一步处理
我认为 find 的输出包含一些非 ASCII 字符...并且 'grep' 认为输入是“二进制”文件...试试这个: find 。 -type f -name "MySoftware" 2>/dev/null | grep -aE '1.12.0'
太棒了。非常感谢!以上是关于bash:在 shell 脚本中使用正则表达式查找和 grep的主要内容,如果未能解决你的问题,请参考以下文章
Shell脚本正则表达式之——grepegrepsed(内含多个Demo)