web-dev-qa-db-ja.com

vim / sedで複数の空白行を1つの空白行に置き換える

質問は多かれ少なかれそれをすべて言います。 /^$/dはすべての空白行を削除しますが、「2行以上の空白行を1つの空白行に置き換える」と言う方法がわかりません

何か案は?

46
Andrew Bolster

Vimを起動していない場合や、他の用途でsedを使用していない場合、catには実際には複数の空白行を折りたたむ簡単な組み込み方法があります。cat -sを使用するだけです。

すでにvimにいてそこにとどまりたい場合は、内部検索でこれを実行し、次のコマンドを発行して置換できます::%s!\n\n\n\+!^M^M!g(^ Mは改行の視覚的表現です。 Ctrl+vEnter)、またはcat::%!cat -sに入力するだけで入力を保存できます。

53
Caleb

\nを使用して、検索パターンの改行を示します。使用する Ctrl+M 置換テキストまたは後方参照。 :help pattern および :help sub-replace-special:help :s からリンク)を参照してください。

%s/\(\n\n\)\n\+/\1/

Vimの場合は、次のようにします。

:%!cat -s
6
coanor

Perlの使用:

Perl -00 -pe ''

-00コマンドラインオプションは、段落のスラップモードをオンにします。つまり、Perlはテキストを行単位ではなく段落単位で読み取ります。

0
Majid Azimi

Sed(GNU sed)4.2.2の場合:

sed -r '
  /^\s*$/ { 
    # blank line
:NEXT
    N # append next line to pattern space - if none, autoprint PS and exit
    s/^\s*$\n^\s*$//g;t NEXT # if 2 blank lines, clear PS and loop to NEXT
  }
  # else, autoprint PS and next/exit
' < $MYFILE
0
PJ_Finnegan