如何仅在数字和句子之间替换换行符?

How do I replace newlines only between numbers and a sentence?

我想在某些特殊情况下删除换行符。我有这段文字:

0 
15.239 
23.917 
 Reprenem el debat que avui els oferim entorn de les perspectives d'aquest dos mil set. <ehh> Estavem parlant concretament dels temes 
30.027 
de la seguretat mundial 
 una miqueta 
de la intervencio
33.519 
que 

我想这样替换数字和一些文本之间的换行符:

0 
15.239 
23.917 Reprenem el debat que avui els oferim entorn de les perspectives d'aquest dos mil set. <ehh> Estavem parlant concretament dels temes 
30.027 de la seguretat mundial una miqueta de la intervencio
33.519 que

我只想删除数字和句子之间的新行。

谁能帮帮我?

我将按照您的示例输出进行操作,它还会删除句子中间的换行符。你可以使用这个:

sed ':a $!{N;ba}; s/\n\([^0-9]\)//g' filename

也就是

:a $!{N;ba}          # assemble the whole file in the pattern space
s/\n\([^0-9]\)//g  # remove newlines that are not directly before a number

要处理 DOS 换行符,您可以使用

#                   vvvv-- new stuff here
sed ':a $!{N;ba}; s/\r\?\n\([^0-9]\)//g' filename

这将有选择地匹配 \n 之前的 \r 并删除整个 \r\n 以防它发现 DOS 换行符。

或者你可以使用 dos2unix。

一个awk:

awk '/^[0-9]+\.[0-9]+/{printf "\n"}{printf [=10=]}' filename

用于处理 DOS 换行符:

awk '{sub(/\r$/,"")}/^[0-9]+\.[0-9]+/{printf "\n"}{printf [=11=]}' filename

演示:

$ awk '{sub(/\r$/,"")}/^[0-9]+\.[0-9]+/{printf "\n"}{printf [=12=]}' filename                        

0 
15.239 
23.917  Reprenem el debat que avui els oferim entorn de les perspectives d'aquest dos mil set. <ehh> Estavem parlant concretament dels temes 
30.027 de la seguretat mundial  una miqueta de la intervencio
33.519 que que

解释代码:

  • {sub(/\r$/,"")} : 删除 DOS 换行符。

  • /^[0-9\.]+/{printf "\n"}:当行以number/dot组合开始时,只打印一个回车符return并继续记录处理。

  • {printf [=20=]} :对于剩余记录或那些不是以数字开头的记录只打印 [=21=] 没有换行符。

  • 最后,将马车 return 放在数字前面并忽略其余部分就可以了。