sed one-liner删除所有单个换行符?

时间:2011-04-22 00:44:26

标签: regex sed

例如,

A paragraph's newlines would be removed let's say
it contained only single
newlines.

然后我想跳过的事情:

However.

Our previous pair of newlines wouldn't.

3 个答案:

答案 0 :(得分:6)

这不是 sed 解决方案 - 虽然您当然可以通过 s2p 运行任何 sed - 但使用 perl 是:

% perl -i.orig -ne 'print unless /^$/' file1 file2 file3

这样做的好处是可以扩展到空白行上的任何空格,如空格和制表符:

% perl -i.orig -ne 'print unless /^\s*$/' file1 file2 file3

如果文件具有各种行结尾(如CR或CRLF),您也可以这样做,假设您运行的是perl 5.10或更高版本:

% perl -0777 -i.orig -ne 's/\R+/\n/' file1 file2 file3

将一个或多个Unicode行分隔符的所有序列规范化为单个换行符。

如果您的UTF-8文件可能(例如)其他空行中有U + 00A0 NON-BREAK SPACE,您可以通过使用告诉perl它们是UTF-8来处理它们。 CSD 命令行开关:

% perl -CSD -i.orig -ne 'print unless /^\s*$/' file1 file2 file3

更新

我真的不清楚删除一个段落是什么意思。我想你只是想在一个段落中加入一行。

如果是这样 - 如果您想要做的是从段落中挤出换行符,那么您希望这样做:

% perl -i.orig -00 -ple 's/\s*\n\s*/ /g' file1 file2 file3

它可能看起来不起作用,但确实如此:尝试一下。

答案 1 :(得分:1)

这是一个sed解决方案。

$ sed -n -e '1{${p;b};h;b};/^$/!{H;$!b};x;s/\(.\)\n/\1 /g;p' 5751270.txt
A paragraph would be removed let's say it contained only single newlines.

However.

Our previous pair of newlines wouldn't.

答案 2 :(得分:1)

您可以尝试使用此bash脚本

#!/bin/bash

exec 8<"file"
while read -r line <&8
do
    if (( ${#line} > 0 )); then
        read -r next <&8
        if (( ${#next} > 0 ));then
            continue
        else
            echo "$line"
            echo "$next"
        fi
    fi
done
exec <&8-