11 sed awk perl text-processing
我的文本文件如下所示:
This is one
sentence that is broken.
However this is a good one.
And this
one is
somehow, broken into
many.
Run Code Online (Sandbox Code Playgroud)
我想删除后跟以小写字母开头的行的任何行的尾随换行符。
所以这应该是:
This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
编辑:这里有一些非常好的答案,但我选择接受第一个有效且最早的答案。非常感谢大家!
Sté*_*las 10
与awk
:
awk -v ORS= '{print (NR == 1 ? "" : /^[[:lower:]]/ ? " " : RS) $0}
END {if (NR) print RS}'
Run Code Online (Sandbox Code Playgroud)
也就是说,不要将记录分隔符附加到每一行(ORS 为空)。但前面加上当前行之前记录分隔如果不是在第一行和当前行不以小写字母开头。否则,除第一行外,请在前面添加一个空格字符。
尝试
awk '$NF !~ /\.$/ { printf "%s ",$0 ; next ; } {print;}' file
Run Code Online (Sandbox Code Playgroud)
在哪里
$NF !~ /\.$/
匹配最后一个元素不以点结尾的行,{ printf "%s ",$0
用尾随空格打印此行,不换行,next ; }
获取下一行,{print;}
并打印出来。我相信会有一个sed
选择。
注意:这适用于以点结尾的行,但是以大写字母开头的句子中的条件不会合并。请参阅 Stéphane Chazelas 的回答。