对于 bash 中的每个正则表达式匹配

对于 bash 中的每个正则表达式匹配

我正在寻找这样的东西......

给定这个文件(我们称之为“foo.log”):

START_OF_ENTRY
line2
END_OF_ENTRY
START_OF_ENTRY
no match
END_OF_ENTRY
START_OF_ENTRY
line2
END_OF_ENTRY

执行以下命令:

pcregrep -M -o '(?m)^START_OF_ENTRY\nline2\nEND_OF_ENTRY$' foo.log | for match in STDIN; do echo "match: $match"; done

会产生

match: START_OF_ENTRY
line2
END_OF_ENTRY
match: START_OF_ENTRY
line2
END_OF_ENTRY

这在 bash 中可能吗?

答案1

使用bash正则表达式匹配附带条件是bash 中似乎没有与^和锚点等效的多行$

x=$(<foo.log)

printf -v re 'START_OF_ENTRY\nline2\nEND_OF_ENTRY'

while [[ $x =~ $re ]]; do 
  printf 'match: %s\n' "${BASH_REMATCH[0]}"; x=${x#*${BASH_REMATCH[0]}};
done
match: START_OF_ENTRY
line2
END_OF_ENTRY
match: START_OF_ENTRY
line2
END_OF_ENTRY

使用 Perl,您可以使用m修饰符使^$在多行上下文中有意义:

perl -0777 -nE 'while ($_ =~ /^(START_OF_ENTRY\nline2\nEND_OF_ENTRY)$/mg) {say "match: $1"}' foo.log

相关内容