2016-03-31 5 views
1

ファイルの実行を置き換える:私は空白(スペースや改行)の連続した実行を交換したいPerlはregexs:空白はスペースや改行でのみ構成さの<code>bar</code>スペースや改行

$ cat bar 
1, 2, 
    3, 
4 

Sで、すなわち希望出力は次のとおりです。

1,S2,S3,S4S 

はしかし、すべての私の試みは\nが1 Sによって置き換えられているになり、そしてすぐに、それは別のSに置き換え従っスペース:

$ cat bar | perl -pe 's/\s+/S/g' 
1,S2,SS3,S4S 
$ cat bar | perl -pe 's/\s+/S/gm' 
1,S2,SS3,S4S 
$ cat bar | perl -pe 's/\s+/S/gms' 
1,S2,SS3,S4S 
$ cat bar | perl -pe 's/[ \n]+/S/gms' 
1,S2,SS3,S4S 
$ cat bar | perl -pe 's/[ \n]+/S/gm' 
1,S2,SS3,S4S 
$ cat bar | perl -pe 's/[ \n]+/S/g' 
1,S2,SS3,S4S 

これらはすべて私が考えることができる、関連する正規表現のフラグの組み合わせです:/g(グローバル置換)、/s.マッチ改行を聞かせて)、および/m(複数行)。私はいつも3の前にSSを持っています。ここではちょうどSがほしいと思っています。

ご協力いただければ幸いです。

答えて

2

perl -pは、行単位で入力を読み取ります。入力全体を一度に読むか、前の行が空白で終わったかどうかを覚えておく必要があります。

perl -0777 -pe 's/\s+/S/g' 

-0777は、ファイル全体を一度に読み込みます。

perl -pe 's/^\s+// unless 1 == $.; s/\s+/S/g;' 

ここでは、先頭の空白が削除されます(最初の行を除く)。とにかく改行を前に置かなければならないことはわかっています。

+0

'-0777'、TIL!今度は –

+0

のように、 '-0'は' -0777'と同様に動作しませんか?ここに私の例があるようです。 私はのための可能な意味合いで、それについての議論は[こちら](http://www.perlmonks.org/?node_id=269283)と[ここ](http://stackoverflow.com/a/9671078/544236)を参照してくださいユニコードの取り扱いは、どちらか一方がより理にかなっているのかどうかは分かりません。 –

+2

@RyanWilliams '-0'は、入力にnullバイトが含まれていない限り動作します。この場合、大丈夫です。 '-0777'は入力に含まれる文字にかかわらず常にファイル全体をスラップするので、より良いです。また、 '-0777'は慣習的に" slurp "を意味するので、経験豊かなPerlプログラマは意図的にヌルバイトで分割しているのかどうかわからなくても、一目で何をしているのか理解することができます。 – ThisSuitIsBlackNot

関連する問題