Mengganti Beberapa baris kosong dengan satu baris kosong di vim / sed

42

Pertanyaan kurang lebih mengatakan itu semua. Saya sadar bahwa /^$/dakan menghapus semua baris kosong, tetapi saya tidak bisa melihat bagaimana mengatakan 'ganti dua atau lebih baris kosong dengan satu baris kosong'

Ada ide?

Andrew Bolster
sumber

Jawaban:

48

Jika Anda tidak menggunakan vim atau sed untuk penggunaan lainnya, kucing sebenarnya memiliki cara mudah untuk meruntuhkan banyak garis kosong, cukup gunakan cat -s.

Jika Anda sudah berada di vim dan ingin tetap di sana, Anda dapat melakukan ini dengan pencarian internal dan ganti dengan mengeluarkan: :%s!\n\n\n\+!^M^M!g(^ M adalah representasi visual dari baris baru, Anda dapat memasukkannya dengan menekan Ctrl+ vEnter), atau menyimpan sendiri mengetik dengan hanya shelling out untuk kucing: :%!cat -s.

Caleb
sumber
wow, tidak tahu -sopsi kucing - hanya catatan bersejarah, tidak dalam POSIX, tetapi tampaknya tersedia di kucing BSD dan GNU.
maxschlepzig
2
Ditandai sebagai 'menang' untuk :%!cat -s. Pelajari sesuatu GNnew setiap hari!
Andrew Bolster
3
Saya pikir Anda juga dapat menggunakan \ M bukan ^ M seperti ini:%s!\n\n\n\+!\r\r!g
Niko Bellic
Saya membutuhkan ini hari ini. Terima kasih, Caleb! :)
Dɑvïd
19

Gunakan \nuntuk menunjukkan baris baru dalam pola pencarian. Gunakan Ctrl+ Mdalam teks pengganti, atau referensi-ulang. Lihat :help patterndan :help sub-replace-special(ditautkan dari :help :s).

%s/\(\n\n\)\n\+/\1/
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bisakah Anda jelaskan bagaimana pola pencariannya?
Sagar Jain
@sjmp Persyaratan: ganti dua atau lebih baris kosong dengan satu baris kosong. Implementasi: ganti tiga atau lebih baris baru berturut-turut dengan hanya dua baris baru. Lihat manual untuk penjelasan tentang konstruksi yang digunakan dalam perintah.
Gilles 'SO- stop being evil'
Tetapi mengapa Anda perlu menggunakan grup saat isinya diperbaiki?
Sabuncu
@ Sabuncu Anda tidak perlu menggunakan grup. Tapi mengapa tidak menggunakan grup? Di sini, saya menggunakan grup karena Anda tidak dapat menyalin-menempelkan perintah dengan baris baru di teks pengganti: Anda harus memasukkan karakter Ctrl + M literal, \ntidak berfungsi dalam teks pengganti.
Gilles 'SANGAT berhenti menjadi jahat'
Sekarang saya mengerti, terima kasih telah meluangkan waktu untuk menjawab.
Sabuncu
6

Jika di Vim, lakukan saja ini:

:%!cat -s
coanor
sumber
2
Anda mungkin ingin menambahkan sedikit detail tentang cara kerjanya, meskipun itu hanya kutipan dari manhalaman.
jasonwryan
Tidak berfungsi di windows 7
user674669
0

Menggunakan Perl:

perl -00 -pe ''

-00 opsi baris perintah mengaktifkan mode slurp paragraf, yang berarti Perl membaca paragraf teks demi paragraf daripada baris demi baris.

Majid Azimi
sumber
0

Dengan sed (sed GNU) 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
PJ_Finnegan
sumber
-2

Saya tahu ini adalah kode yang konyol, tetapi saya ingin menyelesaikan masalah ini dalam waktu kurang dari 10 menit, dan itu berhasil

for file in /directory/*
do
  originalname=$file
  us='_'
  tempname=$file$us
  echo $originalname
  mv $originalname $tempname
  uniq $tempname $originalname
  rm $tempname
done
Mahmoud Zalt
sumber
1
uniqmenghapus garis sama yang berdekatan. Bukan itu yang diinginkan OP.
pacholik
@pacholik dia dengan jelas mengatakan "Mengganti Beberapa baris kosong dengan satu baris kosong" TIDAK menghapus garis sama dengan yang berdekatan !!!
Mahmoud Zalt
3
Ya, persis ...
pacholik