bash:在 shell 脚本中使用正则表达式查找和 grep

Posted

技术标签:

【中文标题】bash:在 shell 脚本中使用正则表达式查找和 grep【英文标题】:bash: find and grep with regex in shellscript 【发布时间】:2022-01-13 18:41:18 【问题描述】:

我安装了某个软件的多个版本(我们称之为MySoftware),我喜欢通过findgrep 的组合找到特定版本的路径。 假设我有以下版本: 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脚本之正则表达式

Shell脚本 正则表达式 grep sed awk 工具

Shell脚本正则表达式之——grepegrepsed(内含多个Demo)

linux学习第4天(自习)

如何在 linux shell 脚本中使用正则表达式搜索文件 [关闭]

shell脚本——正则表达式(包含grep详细介绍及应用)