2011-04-22 31 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-