Regex vim'de sadece tamsayı içeren satırları bulmak için


1

Tamsayıları (satır numaraları) ve metni içeren bir dosyam var. Bir PDF dosyasını açarak bu satır numaraları metinden ayrı satırlara kondu ve tüm bu satır numaralarını silmek istiyorum. Regexes konusunda çok yetenekli değilim ama% 100 süper zor olmamalıdır eminim. Ben vim / nvim kullanıyorum, fakat awk / sed kullanmak zorunda olsaydım, bu benim için de işe yarayacaktı.

Dosya şuna benzer:

123
124
125

Text was found in
those three lines
should stay

Bu yüzden ideal olarak aramak istiyorum: pozitif bir tamsayı ile başlayan tüm çizgiler (1,2,3 ... 123456) ve bu tamsayıdan başka bir şey içermez. Silinmeleri gerekir.

Herhangi bir yardım çok takdir edilmektedir.

Bonus mücadelesi : nedense, bazı satırlarla başlar ^L1234, bu yüzden ek bir özel karakter var. Bir noktada bunları da silmek istiyorum. Yine de ayrı adımlar olabilir.

Yanıtlar:


0
  • [0-9] basit Toplamak hemen hemen her yerde çalışan rakam. Vim'de ayrıca kullanabilirsiniz \d (ondalık basamak) de.
  • Bir veya daha fazla örnek istiyorsan: \+ çarpanı.
  • Satırdaki tek şey bu olmalı, bu yüzden regexp'nin olması gerekiyor. demirli başlangıcına ve sonuna ^ ve $, sırasıyla).
  • Tüm hatlarda bir eşleşme denemek istersiniz; Vim’de :global/{pattern}/.
  • Eşleşen çizgiler olmalıdır :delete d.

Birlikte alındıklarında:

:global/^[0-9]\+$/delete

Ayrıca kullanabilirsiniz sed; daha hızlı ve etkileşimli çalışmıyor. Bu, tüm giriş satırlarına otomatik olarak herhangi bir kural uyguladığından, :global, ve :delete sadece bir d Orada. İle -i, değiştirme işlemi yerinde yapılır (doğru olduğundan ve orijinal dosyanın yedek bir kopyasına sahip olduğunuzdan emin olun!)

sed -i -e '/^[0-9]\+$/d' file

İsteğe bağlı önek için, bunun için çarpan \?. Eğer ^L tek bir karakter ise, büyük olasılıkla Vim <C-V><C-L>.


Çok teşekkür ederim. Aslında düşündüğümden daha yakındım. Kaçan + karakter çok yardımcı oldu ve oradan, kayıp tahmin etmiş olabilirim $ kendimi imzala. <C-V><C-L> şey aynı derecede iyi çalıştı.
Paul

Gördüğünüz gibi, regexp lehçeleri arasında, sadece Vim ve sed arasında ince farklar var. Vim'de, kaçış miktarını bile etkileyebilirsiniz (üzerinden \V / \v ). Vim ile tahminde bulunmanıza gerek yok; mükemmel yardımı var. :help patterns burada iyi bir başlangıç ​​olurdu.
Ingo Karkat

0

Vim'de yalnızca tamsayıları içeren ve içeren satırları kaldırın

:%s/^[0-9]\+\n//gc

açıklama

  • :%s// - global arama ve değiştirme
  • ^ - satır başında başlar
  • [0-9] - maç rakamları
  • \+ - açgözlü maç bir veya daha fazla
  • \n satırsonu eşleş (Not: satır sonlarınızı kontrol edin, bunlar sistemler arasında farklılık gösterir ve örneğin \r\n yerine)
  • gc - global maç + onayla (kaldır c çok varsa ya da eminsen

Çıktı

123
124
125

Text was found in
those three lines
should stay

:%s/^[0-9]*\n//g

Text was found in
those three lines
should stay

Bonus

Başına terdon'ın U & L'ye cevabı , ^L o form feed characterkullanarak ne çıkarılabilir sed:

sed 's/\o14//g' file 

Bunu yapmanın başka yollarını görmek için bu cevabı okumakta fayda var.

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.