我正在寻找这样的东西......
给定这个文件(我们称之为“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