awk如何设置记录分隔符,因为多个连续的空行或行只包含空格和/或制表符?

时间:2014-08-23 07:33:36

标签: regex awk

我知道我可以使用RS=""将记录分隔符设置为多个连续的空行。但是,如果这些行包含空格或制表符,则无法使用。我正在考虑将RF设置为某种正则表达式来进行匹配。但这很难,因为在这种情况下,\n通常会用作字段分隔符FS。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

这是一种方法:

awk '!NF {$0=""}1' file | awk -v RS="" '{print NR,$0}'

第一个awk计算该行上的字段。如果您的空白行或行仅包含空格和制表符,则为0。然后它只是将行更改为空。在此之后,您可以使用RS=""


这是一个gnu awk版本(由于RS中有多个字符):

awk -v RS="\n([[:space:]]*\n)+" '{print NR,$0}' file

它可能没有括号,但我不确定是否所有内容都将被涵盖:

awk -v RS="\n[[:space:]]*\n+" '{print NR,$0}' file

答案 1 :(得分:2)

使用GNU awk进行多字符RS:

awk -v RS='\n(([[:space:]]*\n)+|$)' '{print NR, "<" $0 ">"}' file

e.g。

$ awk '{print NR, "<" $0 ">"}' file
1 <a>
2 <  b>
3 <   >
4 < c>

$ awk -v RS='\n(([[:space:]]*\n)+|$)' '{print NR, "<" $0 ">"}' file
1 <a
  b>
2 < c>