首页 > 解决方案 > 如何正确结合正则表达式并在 shell 脚本中查找

问题描述

我正在尝试编写一个 shell 脚本,该脚本可以从文本文档中获取数字,并使用这些数字来搜索名称中包含数字的所有图片。

我正在与 find 合作,我让它有点工作。如果图片的名称与文本文档中的名称完全相同,或者图片的名称以文本文档中写入的任何数字结尾,则它可以工作。但是如果数字在图片名称的中间,就找不到了。所以我一直在尝试将正则表达式添加到我的 find 命令中,但我没有成功。


input="/Users/unix/Desktop/pictures.txt"
input_2="/Users/unix/Desktop/2019/05/23"
while IFS= read -r -u3 line
do
  find "$input_2" -iregex ".*${line}*.jpg"
done 3< "$input"

例如,如果图片名称是 Right.jpg 并且我的图片.txt 包含 Right,它将找到该文件。如果图片名为leftRight.jpg,它也会找到File。但是如果它是leftRightleft.jpg之类的东西,它就找不到图片,所以我对如何在这里正确使用正则表达式有点困惑。

标签: regexbashshell

解决方案


您的正则表达式根本不正确。如果您将其分解,则可以直观地理解为什么:

.*${line}*.jpg

方法:

  • .*-- 任何重复 0 次或更多次的字符
  • ${line}*-- 的内容${line},最后一个字符重复 0 次或多次
  • .-- 任何单个字符
  • jpg-- 文字字符jpg

因此,对于您的示例,如果您的文件中有Right,您将匹配这些实际文件,您可能不想匹配:

leftRigh.jpg
leftRighXjpg
leftRighttttttttt.jpg
leftRighttttttttttttttttttttttttttttttttjpg

你可能想要的是:

.*${line}.*\.jpg

推荐阅读