Birden çok boş satırın vim / sed içindeki tek bir boş satırla değiştirilmesi


42

Soru az ya da çok her şeyi söylüyor. /^$/dTüm boş satırları kaldıracağının farkındayım , ancak 'iki veya daha fazla boş satırı tek bir boş satırla değiştir' diyemiyorum

Herhangi bir fikir?

Yanıtlar:


48

Başka bir kullanım için vim veya sed kullanmıyorsanız, kedi aslında birden fazla boş çizgiyi daraltmak için kolay bir yerleşik yol kullanır, sadece kullanın cat -s.

Zaten vim içindeyseniz ve orada kalmak istiyorsanız, bunu dahili arama ile yapabilir ve aşağıdakileri düzenleyerek değiştirebilirsiniz: :%s!\n\n\n\+!^M^M!g(^ M, yeni bir hattın görsel temsilidir, Ctrl+ tuşlarına basarak girebilirsiniz vEnter) veya kendinizi sadece kediye ateşinin tarafından yazarak: :%!cat -s.


vay, -skedi seçeneğini bilmiyordum - sadece tarihi bir not, POSIX'de değil, ancak BSD ve GNU kedisinde mevcut gibi görünüyor.
maxschlepzig

2
İçin 'kazanan' olarak işaretleme :%!cat -s. Her gün GNnew bir şeyler öğrenin!
Andrew Bolster

3
Sanırım bu şekilde ^ M yerine de kullanabilirsiniz:%s!\n\n\n\+!\r\r!g
Niko Bellic

Bugün buna ihtiyacım vardı. Teşekkürler Caleb! :)
D Junvïd

19

\nArama düzeninde yeni bir satır belirtmek için kullanın . Kullanım Ctrl+ MYeni metnin ya da bir geribaşvuru içinde. Bakınız :help patternve :help sub-replace-special(bağlantılı :help :s).

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

Arama modelinin nasıl olduğunu açıklayabilir misiniz?
Sagar Jain

@sjmp Gereksinim: iki veya daha fazla boş satırı tek bir boş satırla değiştirin. Uygulama: arka arkaya üç ya da daha fazla yeni satırı yalnızca iki yeni satırla değiştirin. Komutta kullanılan yapıların bir açıklaması için kılavuza bakın.
Gilles 'SO- kötülük' dur

Peki içeriği sabit olduğunda neden bir grup kullanmanız gerekiyor?
Sabuncu

@Sabuncu Bir grup kullanmanıza gerek yok. Ama neden bir grup kullanmıyorsun? Burada, bir grubu kullandım, çünkü değiştirilen metinde yeni bir satırı olan bir komutu kopyalayıp yapıştıramazsınız: değişmez bir Ctrl + M karakteri eklemeniz gerekir, değiştirme metninde \nçalışmaz.
Gilles 'SO- kötülük yapmayı bırak'

Şimdi anlıyorum, cevaplamak için zaman ayırdığınız için teşekkür ederim.
Sabuncu

6

Vim'de ise, sadece şunu yapın:

:%!cat -s

2
Sayfadan sadece bir alıntı olsa bile, bunun nasıl çalıştığıyla ilgili küçük bir ayrıntı eklemek isteyebilirsiniz man.
jasonwryan

Windows 7’de çalışmadı
user674669

0

Perl kullanarak:

perl -00 -pe ''

-00 komut satırı seçeneği paragraf slurp modunu açar, yani Perl, metin paragrafını satır satır yerine paragraftan okur.


0

Sed (GNU sed) ile 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

Bunun aptalca bir kod olduğunu biliyorum ama bu konuyu 10 dakikadan daha az bir sürede çözmek istedim ve çalıştı

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

1
uniqbitişik eşit çizgileri kaldırır. OP'nin istediği bu değil.
pacholik

@pacholik açık bir şekilde “Birden çok boş çizgiyi tek bir boş satırla değiştirmek” dedi.
Mahmoud Zalt

3
Evet, kesinlikle ...
pacholik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.