bash脚本:检查与grep的多行正则表达式匹配

时间:2016-08-24 09:47:05

标签: regex bash grep

我遇到了一个与块匹配的问题,其中包含标题详细信息,稍后将对其进行处理(文件)。这适用于所有.java文件。

我认为到目前为止,问题是由于某种原因它似乎没有进入下一行,以匹配下一行(当然我可能是错的)。它确实匹配regex101.com上的块,但是当我运行脚本时,它似乎没有进入下一行。

我在Win7下使用Cygwin。

到目前为止,只有启用的模式似乎匹配,但这与我不想要的 Example3 匹配;我只想匹配 Example1 Example2

到目前为止,这是我的脚本:

# !/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"

它完全匹配我想要的内容( Example1 & Example2 ),但它在脚本中不起作用! 这里有一个示例文件和匹配块的正则表达式: https://regex101.com/r/kG5iK7/2

这里发生了什么?!非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

主要问题是匹配多线模式。 因此,这就是诀窍:

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

-P激活perl-regexp for grep

-z在行尾

处取消换行符

感谢@Charles Duffy提醒好的练习代码。