我遇到了一个与块匹配的问题,其中包含标题详细信息,稍后将对其进行处理(文件)。这适用于所有.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
这里发生了什么?!非常感谢任何帮助。
答案 0 :(得分:1)
主要问题是匹配多线模式。 因此,这就是诀窍:
if grep -Pz "$PATTERN" "$file"; then
-P
激活perl-regexp for grep
-z
在行尾
感谢@Charles Duffy提醒好的练习代码。