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

时间:2019-04-12 15:54:09

标签: regex 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

2 个答案:

答案 0 :(得分:3)

$ awk '{printf "%s%s", (/^[[:lower:]]/ && (p !~ /\.$/) ? ofs : ors), $0; ofs=OFS; ors=ORS} {p=$0} END{print ""}' 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

答案 1 :(得分:0)

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

awk 'BEGIN{ORS=""}{if(/\.$/){print" ";a=2}else{if(a==2||/^[^a-z]/){print "\n"}else{if(a)print" "};a=1}}END{print"\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
相关问题