2011-12-17 51 views
3

我有以下格式的文件:使用Perl正則表達式多行重新格式化文件

(類型1的數據:1)


(類型1的數據:2)



(類型1的數據:3)

..

現在我要重新格式化此文件,以便它看起來像:

(類型1的數據:1)BB
(類型1的數據:2)BBB
(類型1的數據:3)乙
...

我的方法是用perl正則表達式在命令行中,

cat file | perl -pe 's/\n(B)/ $1/smg' 

我的理由是,以取代與空間換行字符。 但它似乎沒有工作。你能幫我麼?由於

+0

請放棄無用的'貓'。 perl -pe'...'讀取STDIN或一個或多個文件而沒有這種開銷。 – JRFerguson 2011-12-17 22:08:20

回答

5

的-p一次讀取一行,於是就有了「\ n」之後的沒什麼配合。

perl -pe 'chomp; $_ = ($_ =~ /Type/) ? "\n".$_ : " ".$_' 

這幾乎是你想要的,但在開始時增加了一個額外的換行符,並且失去了最後的換行符。

1

這是一個涉及多一點爲-n-p適合最好的一次處理一個線,而你的要求是幾行合併,這意味着你必須保持狀態一會兒。

所以剛讀內存中的整個文件,並應用正則表達式是這樣的:

perl -lwe^
"local $/; local $_ = <>; print join q(), split /\n/ for m/^\(Type [^(]*/gsm" 

使用輸入重定向(<)餵你的文件,這個前衛的STDIN。

注意這個語法是Windows的命令行。對於Bash,使用單引號引用腳本。

4

如果(顯示出來的唯一的地方是在哪裏你希望你的線開始的開始,那麼你可以使用此命令。

perl -l -0x28 -ne's/\n/ /g;print"($_"if$_' < file 
  • -l導致print,在每個它打印行的末尾添加\n
  • -0x28導致它拆就(而不是在\n
  • -n它會導致在輸入迴路。基本上它在開始時增加了while(<>){chomp $_;,並且在-e的末尾增加了}
  • s/\n/ /g
  • print "($_" if $_if $_部分剛剛從印刷開始時一個額外的行停止。