由于 Awk 默认是基于行进行模式匹配的,而无法直接使用正则表达式进行多行匹配。不过我们可以通过改变记录分隔符(RS)使得 Awk 也可以处理多行的数据。
具体方法如下:
awk 'BEGIN {RS = "\n"}'
function match_between(str, startp, left, right, found, rstart, rend)
{
found = 0
while (match(str, left)) {
rstart = RSTART + RLENGTH
if (match(str, right)) {
rend = RSTART - 1
if (RSTART > startp) {
print substr(str, rstart, rend - rstart + 1)
found = 1
}
startp = RSTART
} else {
break
}
}
return found
}
awk -v RS='\n' 'match_between($0, 1, "BEGIN", "END")'
其中 match_between($0, 1, "BEGIN", "END")
表示在第一行中,查找从字符串 "BEGIN" 到 "END" 之间的内容。
通过这种方法,我们就可以在 Awk 中实现多行不贪婪匹配。
完整示例:
function match_between(str, startp, left, right, found, rstart, rend)
{
found = 0
while (match(str, left)) {
rstart = RSTART + RLENGTH
if (match(str, right)) {
rend = RSTART - 1
if (RSTART > startp) {
print substr(str
上一篇:awk多维数组具有多个值
下一篇:awk多行和打印结果