Tüm dosyalardan satırları tekrar tekrar bulma ve silme


14

Kullanarak bir anahtar kelime oluşumunu grep başardı

grep "KeyWord" . -r -n -i -I 

ancak, KeyWord olayları çok büyük. Sadece bu kelimeyi içeren tüm satırları silmek istiyorum.

Etrafı araştırdım, sed yardımcı program gibi görünüyor. Birisi bana hangi komutun hile yapacağını söyleyebilir mi?

Teşekkürler.

Yanıtlar:


25

GNU sed ile:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

Bir OSX sed ile:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

İlk komut findtüm standart dosyaları bulur (dizinler, kanallar vb. Değil), bunları birbirinden ayırarak yazdırır \0(böylece dosya adları boşluklar, yeni satırlar vb. İçerebilir).

İkinci komut xargs, çıktısını okur, findbir ayırıcıya dayalı bir liste yakalar ( \0nedeniyle -0), sed -i [...]listeden eklenen parametrelerle çağırır ( sedparametrelerin maksimum uzunluğu sınırlı olduğu için çok fazla dosya varsa birden çok kez çağrılacaktır) her çağırma).

sedYerinde komutu değiştirir ( -i).

Gelince /KeyWord/d, normal ifadeyi içeren satırları siler KeyWord.

sed(Basit ama olağandışı) sözdizimini doğru bir şekilde anlamayı öğrenmeli ve burada yer alan araçlar hakkında daha fazla bilgi için uygun manajlara bakmalısınız.


Ve tanıtmak istediğim gibi zsh, genişletilmiş globs ile çözüm:

sed -i /KeyWord/d **/*(.)

"Anahtar kelime" kelimesini silmeye ne dersiniz? ve bütün çizgi değil?
SurenNihalani

s/KeyWord//g( herkes için KeyWord'' (boş dize) ile değiştirir ( gher satırda yalnızca ilk değil)
Pierre Carrier

1

Vim'i Ex modunda kullanabilirsiniz:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g küresel arama

  2. d silmek

  3. x kaydet ve kapat


bana verdi OSX, find: illegal option -- teklemek zorunda. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik
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.