如何在awk中匹配换行符?

3

输入文件text.txt:

foo()
{
}

buz()
{
}

Awk script.awk:

BEGIN {
    RS = "\n\n+";
    FS = "\n";
}
/[a-z]+\(\)\n/ {print "FUNCTION: " $1;}
{print "NOT FOUND: " $0;}

运行脚本:

awk -f script.awk text.txt

结果为:

NOT FOUND: foo()
{
}
NOT FOUND: buz()
{
}

但我希望匹配两个函数时可以包括换行符。如何实现?


你使用的 awk 版本是什么? - glenn jackman
4个回答

5

由于您已经将"\n"作为FS使用,因此您可以直接与$1进行匹配:

awk -v RS='\n\n+' -v FS='\n' '
  $1 ~ /^[a-z]+\(\)$/ {print "FUNCTION: " $1; next}
  {print "NOT FOUND: " $0}
' text.txt

这适用于gawk:

FUNCTION: foo()
FUNCTION: buz()

我需要匹配带有新行符\n的表达式。在你的例子中,正则表达式末尾没有\n - egor7
1
你正在使用换行符作为字段分隔符。为什么不想利用它呢? - glenn jackman

3
你可以尝试这个方法:
BEGIN {
    RS = "";
    FS = "\n";
}
/[a-z]+\(\)/ {print "FUNCTION: " $1;}
!/[a-z]+\(\)/ {print "NOT FOUND: " $0;}

如果你想验证括号内是否为空,可以这样做:

$1~/[a-z]+()$/ {print "函数名:"$1;}

不知道为什么换行符没有匹配成功。或许有人可以解释一下。


我读过RS = ""RS = "\n\n+"是一样的,但是它们并不像你上面提到的那样。但是为什么呢。。 - egor7

3
这可能对您有用(GNU awk):
awk '{if(/^[a-z]+\(\)\n/)print "FUNCTION:"$1; else print "NOT FOUND: "$0}' RS="" file

我需要匹配带有新行符\n的表达式。在你的例子中,正则表达式末尾没有\n - egor7
哎呀!忘记换行了!已修正解决方案。 - potong

0

不确定您期望的输出是什么。

为了在awk中处理FS,您需要引入一个虚拟命令,如$1=$1。如果没有它,就不会进行任何字段解析。

因此,如果您期望的结果是这样的:

foo() { }
buz() { } 

只需输入:

awk  '{$1=$1; print} '  RS='\n\n' FS='\n' OFS=" "

RS=""足以,不需要RS='\n\n'。 - mug896

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接