有没有办法在awk中匹配表达式后连接行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法在awk中匹配表达式后连接行?相关的知识,希望对你有一定的参考价值。

我正在尝试以更好的方式格式化文本。我想有条件地加入awk中的两个后续行:如果行以“。”结尾。如果该行不以“。”结尾,则按原样打印该行。如果后者以小写字母开头,则加入此行和后续行。

我试过这个调用awk -f脚本文件的文本文件

 if ( $NF ~ /.*\./ )
    print $0;
  else 
    line_p=$0;
    getline;
    if ( $0 ~ /^[ a-z]+/ )
        print line_p, $0;
    else 
        print line_p;
        print $0
        
    

我试过这个:

io sono un segno
cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni 
-eterni cavalli
opere incompiute

但输出是这样的:

io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni 
-eterni cavalli
opere incompiute opere incompiute

我不明白最后的重复以及为什么第6和第7行没有连接在一起

预期:

io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni 
-eterni cavalli opere incompiute
答案
$ awk 'printf "%s%s", (/^[[:lower:]]/ && (p !~ /\.$/) ? ofs : ors), $0; ofs=OFS; ors=ORS p=$0 ENDprint ""' file
io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni
-eterni cavalli opere incompiute
另一答案

您可以将输出记录分隔符设置为空字符串,并根据当前行是否以.结束来设置标记,以便在处理下一行时,您可以根据标记手动输出空格或换行符以及是否在打印当前行之前,当前行以小写字母开头:

awk 'BEGINORS=""if(/\.$/)print" ";a=2elseif(a==2||/^[^a-z]/)print "\n"elseif(a)print" ";a=1ENDprint"\n"1' textfile

这输出:

io sono un segno cavallo come un cammello.
Il mio vitello si chiama segno di
Budd chiari. Se non fosse così:
-cavalli eterni 
-eterni cavalli opere incompiute

以上是关于有没有办法在awk中匹配表达式后连接行?的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令中使用正则表达式

三个支持正则表达式的行处理的工具: grep/sed/awk

Linux 正则表达

Linux 正则表达

awk从入门到入土正则匹配

shell正则表达式