Regex 使用正则表达式标识文件名中两个不同的子字符串中的任何一个?

Regex 使用正则表达式标识文件名中两个不同的子字符串中的任何一个?,regex,linux,bash,gnu-findutils,Regex,Linux,Bash,Gnu Findutils,当我运行脚本时,我会在源目录中的文件中指定要查找的模式。模式可以位于文件名中的任何位置 当我这样做时: sh packageScript.sh -p ".*TOM.* 脚本可以按需要工作,并且名称中带有“TOM”的所有文件都打包好了 但是,如果我想让脚本打包名称中带有“TOM”或“JER”的文件,脚本就会失败。我尝试了以下每种方法: sh packageScript.sh -p ".*TOM.*||.*_JER_.*" sh packageScript.sh -p ".*TOM.*|.*_JE

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

当我这样做时:

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
已更正为
\u JER
,要求是使用
find
将循环更改为:

while IFS= read -d '' -r file; do 
   //things get done here
   echo "$file"
done < <(find . -type f -regextype posix-egrep -regex ".*($PATTERN).*" -print0)

我逃过了
|
,这似乎成功了。最后命令:
“*TOM.*\\|.*.\u JER.*”

检查这个答案,它可能会帮助你用反斜杠逃避
。@Cyrus谢谢。我不必包含括号,但转义了|就行了。我找到了一个更简单的解决方案(如下所示)Thanksok。请记住,它将中断可能包含空格或全局字符的文件名。
bash packageScript.sh -p 'TOM|JER'