sed格式化excel的換行符

czxin788發表於2015-04-02
    
   今天,朋友給我發來一段文字,他想讓下面文字的第2,3行合併為一行,第4,5行合併為一行。
    "id,name"
"abcd,d",",b,c,d
df"
"121,3","張三,
zhangsan"

    他這個文字本來是excel的csv格式,但csv的資料在linux上以文字方式開啟後,原來在excel一個單元格里的資料可能會分兩行顯示。如上面的"b,c,ddf"本來是在excel的一個單元格里面的,但你看在linux 以文字開啟後,就顯示成了兩行。
    我說那你用excel開啟處理一下啊。他說資料太大,用excel打不開,問能不能在linux透過工具給處理一下。


     我也在網上搜尋了一下,最終用sed的N功能實現,對於sed我還是有了解的,但對於sed的N功能我也是第一次知道(看來sed和awk可我還有很多東西不知道的)。

     原文字如下:

[root@node1 ~]# cat test
"id,name"
"abcd,d",",b,c,d
df"
"121,3","張三,
zhangsan"
     
     利用sed的N+替換s功能得以實現:
[root@node1 ~]# sed '/[^"]$/{N;s/\n//}' test
"id,name"
"abcd,d",",b,c,ddf"
"121,3","張三,zhangsan


解釋:

/[^"]$/ 這個是在sed裡面運用了正規表示式。
[^"]表示引號"除外。
[^"]$表示引號"結尾的行除外。$是以什麼結尾。
N表示把當前行和下一行合併。
  \n是換行符的意思。
sed '/[^"]$/{N;s/\n//}' test 的解釋就是在test文字中,將不是以引號"結尾的行和它的下一行合併成一行。

   好了,相信你看了上面的解釋,一定明白了這個命令列的意思了。


   為了更好的解釋sed的N功能,我們做以下幾個實驗,以加深理解。

   
[root@node1 ~]# cat test
"id,name"
"abcd,d",",b,c,d
df"
"121,3","張三,
zhangsan"

[root@node1 ~]# sed '$!N;s/\n/ /' test
"id,name" "abcd,d",",b,c,d
df" "121,3","張三,
zhangsan"

注:$是最後一行,!是不配匹的意思,N的意思就是把下一行追加到當前行尾。
$!N連起來的意思也就是一直向下N,直到最後一行不N。


下面詳細說一下N命令:
    如果沒有下一行:
                自動輸出模式空間的內容(-n會阻止該輸出),立即結束整個指令碼。
    如果有下一行:
                在模式空間的內容後追加換行符(\n 0x0A),然後讀入下一行追加到換行符之後。
                控制傳遞給後續命令。如果有下一行,N後模式空間的內容應該是“模式空間原來的內容\n當前行的內容"。

我們再看下面的例子。

例子1:
[root@node1 ~]# sed 'N;s/\n/ /' test
"id,name" "abcd,d",",b,c,d
df" "121,3","張三,
zhangsan"

看到用$!N;s/\n/ /和N;s/\n/ /輸入的結果一樣。


例子2:
[root@node1 ~]# cat test
"id,name"
"abcd,d",",b,c,d
df"
"121,3","張三,
zhangsan"
[root@node1 ~]# sed '3N;s/\n/ /' test
"id,name"
"abcd,d",",b,c,d
df" "121,3","張三,
zhangsan"

上面的3N表示只合並第三行和第四行,其他行不合並。


好了,今天就到這了。




 





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-1484111/,如需轉載,請註明出處,否則將追究法律責任。

相關文章