Sed için tek bir çağrı ile birden fazla düzenleme yapın


16

Bir yapılandırma dosyasını düzenlemek için sed kullanmaya çalışıyorum. Değiştirmek istediğim birkaç satır var. Linux altında sed -iyerinde düzenlemelere izin verdiğini biliyorum, ancak bir yedekleme dosyasına kaydetmenizi gerektiriyor. Ancak birden fazla yedekleme dosyasına sahip olmaktan kaçınmak ve tüm yerinde değişiklikleri bir kerede yapmak istiyorum.

Bunu yapmanın bir yolu var mı yoksa sed -idaha iyi bir alternatif var mı?

Yanıtlar:


22

sedYalnızca tekrarlayarak -e(veya -fkomut dosyanız bir dosyadaysa) birden çok işlem gerçekleştirmeyi söyleyebilirsiniz .

sed -i -e 's/a/b/g' -e 's/b/d/g' file, fileyerinde tek bir dosyada her iki değişikliği yapar . Bir yedek dosyası olmadan.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' file, fileyerinde tek bir dosyada her iki değişikliği yapar . Adlı tek bir yedekleme dosyası ile filebak.


2
Sıralamanın önemli olduğunu unutmayın. Yukarıda verilen örnek komutta, harfin tüm örnekleri adönüştürülür bve sonra tüm örnekleri bdönüştürülür d. Aynı şeyi sed -i -e 's/a\|b/d/g' filetüm ya ada tüm örneklerini döndürerek byapabilirsiniz d.
Wildcard

4

Başka bir alternatif, exselefidir vi. Bu aslında yerinde senaryolu dosya düzenleme için tercih POSIX aracı; Perl'den çok daha esnek ve tartışmasız daha taşınabilir. (Windows dünyasının dışında kalırsanız, tartışmasız Perl'den daha taşınabilir.)sed -i

Kullanılarak, örnek komutları bu Stack Exchange üzerinde ilgili bir eksiklik vardır exkullanılarak, örnek komutları bolluk ile karşılaştırıldığında, en azından sed, awkve Perl. Ancak, kendimi POSIX teknik özelliklerineex kapsamlı bir şekilde araştırdım ve o zamandan beri davulunu dövüyorum. exHem burada hem vi / Vim stackexchange kullanarak birçok cevap yazdım :

Daha fazla okuma:


3

Birden çok -eseçeneği kullanmanın yanı sıra , sed komutlarını yeni satırları veya noktalı virgülleri kullanarak tek bir sed komut dosyasında ayırabilirsiniz.

Bu komut dosyasının komut satırında bir satır veya bir komut dosyası olması durumdur.

Örneğin

sed -e 's/a/b/g ; s/b/d/g' file

Etrafındaki boşluk karakterleri ;isteğe bağlıdır. Onları burada, iki nokta üst üste işaretinin öne çıkmasını sağlamak için kullandım (genel olarak, komutları ayıran yeni satırlar dışında, komutlar arasındaki beyaz boşluk yok sayılır ... ancak komutlardaki beyaz boşluğun olabileceğini ve genellikle önemli).

veya:

sed -e 's/a/b/g
        s/b/d/g' file
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.