REGEX:识别文件名中两个不同子串中的任何一个

时间:2018-03-27 18:33:28

标签: regex linux bash gnu-findutils

当我运行脚本时,我在源目录中的文件中指定了我正在寻找的模式。模式可以位于文件名中的任何位置。

当我这样做时:

sh packageScript.sh -p ".*TOM.*

该脚本可以根据需要运行,并且名称中包含“TOM”的所有文件都已打包。

但是如果我希望脚本在名称中打包带有“TOM”或“ JER ”的文件,脚本将失败。我尝试了以下各项:

sh packageScript.sh -p ".*TOM.*||.*_JER_.*"
sh packageScript.sh -p ".*TOM.*|.*_JER_.*"

迭代我脚本中文件的for循环:

for file in $(find -regex "$PATTERN" -type f);
do 
 //things get done here
done

(我在脚本顶部的“while getopts”中将-p标志的值赋给$ PATTERN)

示例文件名:

M_V_CHUCK_TOM_20180105.txt
M_V_CHUCK_TOM_20170105.txt
M_V_CHUCK_TOM_20160105.txt
M_V_JONES_OUT_20180105.txt
M_V_JONES_OUT_20170105.txt
M_V_JONES_OUT_20160105.txt

编辑:JER已更正为_JER_,需求

2 个答案:

答案 0 :(得分:1)

使用find将循环更改为:

while IFS= read -d '' -r file; do 
   //things get done here
   echo "$file"
done < <(find . -type f -regextype posix-egrep -regex ".*($PATTERN).*" -print0)
  • 此脚本使用gnu find的扩展正则表达式功能和-regextype选项。
  • 我们也在使用bash的进程替换

最后将您的代码称为:

bash packageScript.sh -p 'TOM|JER'

答案 1 :(得分:0)

我逃脱了|,这似乎已经成功了。最终命令: ".*TOM.*\|.*_JER_.*"