Sed'deki -n seçeneği ne işe yarar?


13

Bu, man sayfası girişi için -n:

-n

desen alanının otomatik yazdırılmasını bastır

Ben ne zaman fark değil kullanarak -nbelirli işlemler için, her satır bekletilmektedir (ve istenen çizgiler iki kez basılır):

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

Ancak, bu yasa diğer komutlar için geçerli değildir:

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

Peki -n, tam olarak ne yapar ?

Yanıtlar:


17

Normalde sed her satırı işler (yerine koyma vb.), Ardından sonucu yazdırır. İşleme yazdırılan çizgiyi içeriyorsa (örn. Sed pkomutu), iki kez yazdırılır (işleme sırasında bir kez, daha sonra otomatik post-proses baskı ile). Bu -nseçenek otomatik yazdırmayı devre dışı bırakır, yani özellikle yazdırmasını söylemediğiniz satırlar yazdırılmaz ve açıkça yazdırmasını (ör p. İle) yalnızca bir kez yazdırılmasını istediğiniz satırlardır .

  • sed -n '2,3p' test.txt - istendiği gibi yalnızca 2'den 3'e kadar olan satırları yazdırır

  • sed '2,3p' test.txt - her satırı (otomatik olarak) yazdırır VE AYRICA ikinci kez 2-3 satır yazdırır

  • sed -n 's/t/T/' test.txt - "t" harfini her satırda "T" ile değiştirir, ancak sonucu -n

  • sed 's/t/T/' test.txt - "t" harfini her satırdaki "T" ile değiştirir ve sonucu otomatik olarak yazdırır

Bir kaç örnek daha ekleyeyim:

  • sed -n 's/t/T/p' test.txt - "t" harfini her satırda "T" ile değiştirir, SADECE değiştirmenin gerçekleştiği çizgileri yazdırır (yani "ikinci" değil)

  • sed 's/t/T/p' test.txt - "t" harfini her satırda "T" ile değiştirir, yerine koymanın gerçekleştiği satırları yazdırır, ardından her satırı otomatik olarak yazdırır (sonuç: "ikinci" bir kez yazdırılır, diğerleri iki kez yazdırılır)

  • sed '2,3p; 3p' test.txt- 1, 4 ve 5 numaralı satırları bir kez yazdırır (otomatik yazdırma); satır 2'yi iki kez (ilk pkomut sonra otomatik yazdırma) ve satır 3'ü üç kez (her pkomut için bir kez , sonra tekrar otomatik olarak).


Gordon teşekkür ederim ama değerlendirmeniz sadece gözlemimi tekrarlıyor. İlk iki örnekte -n, özel olarak istenen çizgilere ek olarak her satırı yazdırmadan sed . Böylece bu durumda -n ayrıştırılan her satırın baskısını bastırır . Ancak üçüncü ve dördüncü örneklerde davranış farklıdır. Olmadan sed Bu durumlarda -nböylece kullanarak, iki kez değil çıkış hatları yapar -ngelmez çözümlenen her satırın baskı bastırmak ziyade çizgilerin baskı değişmedi bastırır . Davranışın biri ya da diğeri olacağı zaman genelleme yapmakta zorlanıyorum.
dotancohen

Hayır, her iki durumda -nda aynı şeyi yapıyor: otomatik olarak yazdırılan her satırdan (ve pve pdeğiştiriciden yedek bir komuta geçilmesi, satırın ek kez yazdırılmasına neden oluyor) satırların yalnızca özellikle söylediğinizde yazdırıldığı bir moda ( pkomutuyla vb.).
Gordon Davisson

Başka bir yol koy: sed komutuna -nVE AYRICA ekleme seçeneğini eklemeyi deneyin ; p(örn sed -n '2,3p; p'. Ve ikisinde de olmadan aynı sonuçları alırsınız. -nVarsayılan otomatik baskıyı bastırır ve ; paçık (çoğunlukla eşdeğeri) ekler ) yazdırın.
Gordon Davisson

Şimdi görüyorum, teşekkürler. Örneği açıklığa kavuşturmak için zaman ayırdığınız için çok teşekkür ederim. Müthiş bir hafta geçirin!
dotancohen
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.