Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何删除sed中小写字符前面的换行符?_Regex_Awk_Sed - Fatal编程技术网

Regex 如何删除sed中小写字符前面的换行符?

Regex 如何删除sed中小写字符前面的换行符?,regex,awk,sed,Regex,Awk,Sed,我有一个大约5000行的文本文件。我想删除小写字符前面的行,以便 Now is the time for all good men The quick brown fox jumped over 变成: Now is the time for all good men The quick brown fox jumped over 使用GNUsed: sed ':a;N;/\n\([[:lower:]]\)/!ba;s// \1/' file 正确的说法是: #!/bin/bash sed

我有一个大约5000行的文本文件。我想删除小写字符前面的行,以便

Now is the time for
all good men
The quick brown fox
jumped over
变成:

Now is the time for all good men
The quick brown fox jumped over

使用GNU
sed

sed ':a;N;/\n\([[:lower:]]\)/!ba;s// \1/' file
正确的说法是:

#!/bin/bash
sed ':a;N;/'$'\n''\([[:lower:]]\)/!ba;s// \1/' file

因为POSIX没有将
\n
定义为转义序列。

我想我找到了答案

enter code here`sed ':a;N;/\n[a-z]/s/\n/ /;ta;P;D' intput.txt > output.txt

sed是对单个行的简单替换,仅此而已。您试图做的不是在单个行上进行简单的替换,因此您不应该考虑使用sed。只需使用awk:

$ awk '{printf "%s%s", (/^[[:upper:]]/?ors:OFS), $0; ors=ORS} END{print ""}' file
Now is the time for all good men
The quick brown fox jumped over

上述功能将在任何UNIX系统上的任何awk中高效、可移植且健壮地工作。

另一个
awk

$ awk 'FNR>1 && /^[[:upper:]]/{print ""} {printf "%s%s", $0, OFS} END{print ""}' file
和一个
perl

$ perl -ne 'print "\n" if $.>1 && /^[[:upper:]]/; s/\R/ /; print; END{print "\n"}' file

GNU只使用了…您认为GNU在这里具体是什么?使用
\n
。POSIX
sed
不支持自由使用的
\n
(特别是,仅作为嵌入在模式空间中的文本)。用
gsed
和POSIX
sed
试过你的——只有
gsed
有效。否则,太好了。@dawg哦,是的,你是对的!谢谢这一个似乎是一个较短的选择<代码>awk“{printf”%s%s“,$0,(/^[[:upper:]]/?OFS:ORS)}”如果以大写开头的行后面没有以小写开头的行,则将打印尾随空白字符,并且不终止换行符。