2011-04-22 32 views
2

因此,例如,sed单行删除所有单行换行符?

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

然后的事情我会想跳过了:

However. 

Our previous pair of newlines wouldn't. 
+0

只是为了澄清,你想删除的第一款新行,但不删除最后两个之间的空行? – 2011-04-22 01:06:21

+0

@布莱恩是的,就是这样。但不幸的是,它迟到了,我犯了一个错字。抱歉。 – magnetar 2011-04-24 10:33:31

回答

6

这不是一个的sed解决方案 - 虽然你总是可以运行任何的sed通过S2P当然 - 但一个非常简单的解决方案使用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,则可以通过使用-CSD告诉perl它们是UTF-8来处理它们命令行开关:

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

UPDATE

我真的不清楚您可以通过删除段落的意思。我想你只是说在一个段落中加入一行。

如果是这样的 - 如果你想要做的是从段落换行挤,那么你要做到这一点:

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

它可能看起来不像它的工作原理,但它:试试吧。

+0

所以,在你的文章中最后的perl命令将所有东西都转换成一条巨大的线,据我所知。我用错了吗?我想要做的是简化段落的格式,以免他们看起来像'散文'......对于我的问题中的错字感到抱歉。这一定是令人困惑的。顺便说一下,我喜欢你的帖子,我一定会学习一些Perl。 – magnetar 2011-04-24 10:41:43

+0

@magnetar:我有一个错字。你需要* -00 *和两个0。 – tchrist 2011-04-24 13:10:12

+0

它像一个魅力。谢谢!嗨,给那些烙铁对我btw。 – magnetar 2011-05-02 18:46:39

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. 
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-