【问题标题】:bash: find and grep with regex in shellscriptbash:在 shell 脚本中使用正则表达式查找和 grep
【发布时间】: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/

标签: bash grep find


【解决方案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'
  • 太棒了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
相关资源
最近更新 更多