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

这是怎么回事?任何帮助深表感谢。

+0

您是否需要指定全局搜索? –

+0

最后指定? PATERN 9和10(在我的脚本中注释掉)。它没有工作,虽然 –

+0

顺便说一句,本地bash正则表达式机制是'[[$ string =〜$ regex]]';值得明确的是,你的问题和答案都围绕着grep,所以人们不会漫不经心地寻找关于其他机制的信息。 –

主要问题是匹配多线模式。 因此这并获得成功:

if grep -Pz "$PATTERN" "$file"; then 

-P激活Perl的正则表达式grep的

-z抑制换行符在一行的末尾

感谢@Charles达菲提醒的好做法代码。

+0

需要更多引号(除非手边的外壳是zsh);请参阅http://shellcheck.net/进行备份。括号只会让你的代码效率下降;带他们出去。而'-z'不只是压制一个换行符,它**增加了一个NUL **;这真的是你想要的吗? –

+0

'if grep -Pz“$ PATTERN”“$ file”;那么'会去掉parens(因此不必要的子shell)并且添加引号。 –

+0

我在这部分脚本中需要的是精确地匹配稍后将要处理的文件。发布之前,我已尝试过所有的引号和其他格式。问题是使正则表达式到下一行,这是可能的使用-P和-z –