複数の空白行をvim / sedの単一の空白行に置き換える


42

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

何か案は?

回答:


48

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

あなたはvimの中に存在していたし、そこに滞在したい場合は、内部検索でこれを行うと、発行することによって置き換えることができます::%s!\n\n\n\+!^M^M!g(^ Mは、改行を視覚的に表現され、あなたが押すことによって、それを入力することができますCtrl+をvEnter)、または自分でセーブcat:に砲撃するだけで入力します:%!cat -s


うわー、-s猫のオプションを知らなかった-ちょうど歴史的なメモ、それはPOSIXではありませんが、BSDとGNU猫で利用できるようです。
maxschlepzig

2
の「勝ち」としてマークする:%!cat -s。毎日GNnewを学んでください!
アンドリューボルスター

3
次のように^ Mの代わりに\ rを使用することもできると思います。%s!\n\n\n\+!\r\r!g
Niko Bellic

今日はこれが必要でした。ありがとう、カレブ!:)
デビッド

19

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

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

検索パターンはどのように説明されますか?
サガルジャイン

@sjmp要件:2つ以上の空白行を1つの空白行に置き換えます。実装:3つ以上の連続した改行を2つの改行だけに置き換えます。コマンドで使用される構成の説明については、マニュアルを参照してください。
ジル 'SO-悪であるのをやめる'

しかし、その内容が修正されたときにグループを使用する必要があるのはなぜですか?
-Sabuncu

@Sabuncuグループを使用する必要はありません。しかし、なぜグループを使用しないのですか?ここでは、置換テキストに改行を使用してコマンドをコピーアンドペーストできないため、グループを使用しました。リテラルCtrl + M文字を挿入する必要があり、置換テキストで\nは機能しません。
ジル 'SO-悪であるのをやめる'

今、私は理解し、答えてくれてありがとう。
Sabuncu

6

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

:%!cat -s

2
manページからの単なる引用であっても、これがどのように機能するかについて少し詳細を追加したい場合があります。
-jasonwryan

Windows 7では動作しませんでした
user674669

0

Perlの使用:

perl -00 -pe ''

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


0

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

-2

私はこれが愚かなコードであることを知っていますが、この問題を10分以内に解決したかったのですが、うまくいきました

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done

1
uniq隣接する等しい行を削除します。これはOPが望んでいるものではありません。
パチョリク

@pacholik彼は明らかに「複数の空白行を単一の空白行に置き換える」と言って、隣接する等しい行を削除しません!!!
マフムードザルト

3
はい、正確に
...-パチョリク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.