Apa yang dilakukan opsi `-n` dalam sed?

13

Ini adalah entri halaman manual untuk -n:

-n

menekan pencetakan ruang pola secara otomatis

Saya perhatikan bahwa ketika tidak digunakan -nuntuk operasi tertentu, setiap baris dicetak ke stdout (dan baris yang diminta dicetak dua kali):

$ 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

Namun, hukum ini tidak berlaku untuk perintah lain:

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

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

Jadi apa yang -ndilakukan, tepatnya?

dotancohen
sumber

Jawaban:

17

Biasanya, sed memproses setiap baris (melakukan pergantian dll), lalu mencetak hasilnya. Jika pemrosesan melibatkan garis yang sedang dicetak (mis. pPerintah sed ), maka garis tersebut akan dicetak dua kali (sekali selama pemrosesan, kemudian lagi dengan cetak pasca-pemrosesan otomatis). The -npilihan menonaktifkan pencetakan otomatis, yang berarti garis-garis Anda tidak secara spesifik mengatakan itu untuk mencetak tidak bisa dicetak, dan garis-garis Anda secara eksplisit mengatakan itu untuk mencetak (misalnya dengan p) mendapatkan dicetak hanya sekali.

  • sed -n '2,3p' test.txt - hanya mencetak garis 2 hingga 3, seperti yang diminta

  • sed '2,3p' test.txt - mencetak setiap baris (secara otomatis), DAN JUGA mencetak garis 2-3 kali kedua

  • sed -n 's/t/T/' test.txt - mengganti "t" dengan "T" di setiap baris, tetapi tidak mencetak hasilnya karena -n

  • sed 's/t/T/' test.txt - mengganti "t" dengan "T" di setiap baris, dan secara otomatis mencetak hasilnya

Dan izinkan saya menambahkan beberapa contoh lagi:

  • sed -n 's/t/T/p' test.txt - ganti "t" dengan "T" di setiap baris, cetak HANYA garis tempat penggantian (yaitu bukan "kedua")

  • sed 's/t/T/p' test.txt - mengganti "t" dengan "T" di setiap baris, mencetak garis tempat penggantian dilakukan, lalu secara otomatis mencetak setiap baris (hasil: "kedua" dicetak sekali, yang lain dua kali)

  • sed '2,3p; 3p' test.txt- mencetak garis 1, 4, dan 5 satu kali (cetak otomatis); baris 2 dua kali ( pperintah pertama kemudian cetak otomatis), dan baris 3 tiga kali (satu kali untuk setiap pperintah, kemudian lagi secara otomatis).

Gordon Davisson
sumber
Terima kasih, Gordon, tetapi penilaian Anda hanya mengulangi pengamatan saya. Dalam dua contoh pertama, sed tanpa -nmencetak setiap baris di samping baris yang secara khusus diminta. Jadi dalam hal ini -n menekan pencetakan setiap baris diurai . Namun dalam contoh ketiga dan keempat perilakunya berbeda. Dalam kasus-kasus sed tanpa -nmenghasilkan garis dua kali, sehingga menggunakan -ntidak menekan pencetakan setiap baris diuraikan tetapi lebih menekan pencetakan garis tidak berubah . Saya mengalami kesulitan menggeneralisasi ketika perilaku akan menjadi satu atau yang lain.
dotancohen
Tidak, dalam kedua kasus -nmelakukan hal yang sama persis: beralih dari setiap baris secara otomatis dicetak (dan pengubah pdan pke perintah pengganti menyebabkan garis dicetak waktu tambahan) ke mode di mana garis dicetak hanya jika Anda secara khusus mengatakannya ke (dengan pperintah dll).
Gordon Davisson
Dengan kata lain: coba tambahkan -nopsi DAN JUGA menambahkan ; pke perintah sed (misalnya sed -n '2,3p; p', dan Anda akan mendapatkan hasil yang sama seperti Anda akan tanpa keduanya. -nMenekan cetak otomatis default, dan ; pmenambahkan eksplisit (kebanyakan setara) ) cetak.
Gordon Davisson
Saya mengerti sekarang, terima kasih. Saya sangat menghargai Anda meluangkan waktu untuk membantu menjadikan contoh ini eksplisit. Semoga minggu Anda luar biasa!
dotancohen