2014年12月2日火曜日

[Tips] 複数の改行の置換(sed, perl)

会社で仕事していていつも
検索してしまうので、まとめ記載しておこう

linuxのテキスト処理で
空白行や改行の連続を削除する方法です。
sedとperlの方法を以下に記載しとく



○置換用のテストデータ

% cat -n file 
     1
     2 TEST
     3
     4 TEST2
     5
     6
     7
     8
     9 TEST3
    10
    11
    12 TEST4 test5
    13

○空白行の削除

1. sed)
      '/^$/d' で改行のみの行を削除。
% cat file | sed -e '/^$/d' | cat -n
     1 TEST
     2 TEST2
     3 TEST3
     4 TEST4 test5
%

2. perl)
  sコマンドで空白行を置換することで削除しちゃう。
% cat file | perl -pe 's/^\n//' - | cat -n
     1 TEST
     2 TEST2
     3 TEST3
     4 TEST4 test5
%


○複数改行を改行一つに置換

今回やりたかったのは、連続改行の圧縮ですので
レアケースだけど、複数の空白行を1つの改行に置換するには以下でできそう。

1. sed)
  sedは1行毎の処理は得意だけど、行を跨ぐと途端に面倒になる。
  なんとなく出来ているようだけど、最終の改行が削除されているので本当はNG。
% cat file | sed '/^$/{N; /^\n$/D;}' | cat -n
     1
     2 TEST
     3
     4 TEST2
     5
     6 TEST3
     7
     8 TEST4 test5
%

2. perl)
% cat file | perl -pe 's/^\n/,/g' - | perl -pe 's/,,*/\n/g' | cat -n
     1
     2 TEST
     3
     4 TEST2
     5
     6 TEST3
     7
     8 TEST4 test5
     9

○結論

ためしてみたら
Perlの方が簡単だった・・・・

次からはperlを使おう!!

---
以上
ここまで〜

0 件のコメント:

コメントを投稿