bash脚本:检查与grep的多行正则表达式匹配
我有一个问题匹配一个块,具有标题详细信息,稍后将要处理(文件)。这适用于所有.java文件。bash脚本:检查与grep的多行正则表达式匹配
我到目前为止假设的问题是,由于某种原因,它似乎没有进入下一行,以匹配下一行(当然我可能错了)。它确实与regex101.com上的块匹配,但是当我运行该脚本时,它似乎没有进入下一行。
我使用Cygwin的Win7下。
只有启用的模式似乎匹配到目前为止,但这匹配示例3,我不想;我只想匹配示例1和示例2。
这是我的脚本至今:
# !/bin/bash
# Script START - Info
printf "Search for header with X details - START\n"
# Get the total files
FILES_TOTAL=$(ls -l | find . | grep "\.java$" | wc -l)
printf "Files to process: $FILES_TOTAL\n"
# Total nr. of various files
COUNTER_N=0
COUNTER_Y=0
# Set the files to be manipulated (all .java files)
SEARCH=$(find . | grep "\/uk\/" | grep "\.java$")
# Set the pattern for the header to search for
PATTERN='(.*DIGITAL.*)'
# PATTERN="(.*DIGITAL.*)"
############ THE PATTERN IS INCOMPLETE, FOR SOME REASON THE OTHER PATTERNS DO NOT WORK,
############ IT DOESN'T SEEM TO WORK THE NEW LINE/FEED
# PATTERN='(\/\*\*\r\n)(.*DIGITAL)'
# PATTERN="(\/\*\*\r\n)(.*DIGITAL)"
# PATTERN='(.*DIGITAL.*\n)(.*MILAN.*\n)(.*STOCK.*\n)(.*TEL.*\n)'
# PATTERN="(.*DIGITAL.*\n)(.*MILAN.*\n)(.*STOCK.*\n)(.*TEL.*\n)"
# PATTERN='(\/\*\*\n)(.*DIGITAL.*\n)(.*MILAN.*\n)(.*STOCK.*\n)(.*TEL.*\n)((.*\*\n?(\/?)){0,})'
# PATTERN="(\/\*\*\n)(.*DIGITAL.*\n)(.*MILAN.*\n)(.*STOCK.*\n)(.*TEL.*\n)((.*\*\n?(\/?)){0,})"
# PATTERN='(\/\*\*\n)(.*DIGITAL.*\n)(.*MILAN.*\n)(.*STOCK.*\n)(.*TEL.*\n)((.*\*\n?(\/?)){0,})/g'
# PATTERN="(\/\*\*\n)(.*DIGITAL.*\n)(.*MILAN.*\n)(.*STOCK.*\n)(.*TEL.*\n)((.*\*\n?(\/?)){0,})/g"
# For each .java file found
for file in "$SEARCH"; do
# Process files
if egrep -q "$PATTERN" "$file"; then
printf "Has the header: $file \n"
let COUNTER_Y=COUNTER_Y+1
else
# printf "Does NOT have the header: $file "\n"
let COUNTER_N=COUNTER_N+1
fi
# Update nr. of files
let FILES_PROCESSED=COUNTER_Y+COUNTER_N
done
# Script END - Info/Report
printf "Search for header with X details - END\n"
printf "Files - NO header: $COUNTER_N"
printf "Files - YES header: $COUNTER_Y"
printf "Total files processed: $FILES_PROCESSED"
这完全符合了我想要的(例1 & 例2)在网络上,但它并不在剧本工作! 有一个示例文件和匹配块的正则表达式在这里: https://regex101.com/r/kG5iK7/2
这是怎么回事?任何帮助深表感谢。
主要问题是匹配多线模式。 因此这并获得成功:
if grep -Pz "$PATTERN" "$file"; then
-P
激活Perl的正则表达式grep的
-z
抑制换行符在一行的末尾
感谢@Charles达菲提醒的好做法代码。
需要更多引号(除非手边的外壳是zsh);请参阅http://shellcheck.net/进行备份。括号只会让你的代码效率下降;带他们出去。而'-z'不只是压制一个换行符,它**增加了一个NUL **;这真的是你想要的吗? –
'if grep -Pz“$ PATTERN”“$ file”;那么'会去掉parens(因此不必要的子shell)并且添加引号。 –
我在这部分脚本中需要的是精确地匹配稍后将要处理的文件。发布之前,我已尝试过所有的引号和其他格式。问题是使正则表达式到下一行,这是可能的使用-P和-z –
您是否需要指定全局搜索? –
最后指定? PATERN 9和10(在我的脚本中注释掉)。它没有工作,虽然 –
顺便说一句,本地bash正则表达式机制是'[[$ string =〜$ regex]]';值得明确的是,你的问题和答案都围绕着grep,所以人们不会漫不经心地寻找关于其他机制的信息。 –