Bagaimana cara kerja perintah sed ini?


12

Saya menemukan solusi ini untuk mencetak baris tertentu dari file teks:

sed '123!d;q' file

Mengapa tidak berhenti setelah input pertama dalam kasus ini?

Jawaban:


20

Dalam bahasa Inggris, sedprogram ini berarti: untuk setiap baris,

  • [ 123!] jika nomor baris saat ini bukan 123, maka [ d] hapus baris saat ini dan mulai siklus berikutnya (yaitu pindah ke baris berikutnya);
  • lalu (tetapi kita hanya mencapai titik ini jika dperintah tidak dieksekusi), [ q] keluar tanpa memroses baris lagi (tetapi cetaklah garis saat ini dalam pergolakan yang sekarat).

Atau jika Anda lebih suka, dalam sintaksis shell:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done

Terima kasih, itu sudah jelas bagi saya juga. Kesalahan saya adalah bahwa saya mengerti !terhubung ke d, bukan 123.
— rozcietrzewiacz

@Gilles: melewatkan kawat gigi {d;q;}, tidak seharusnya qberlaku untuk setiap baris (jadi hanya yang pertama)?
— enzotib

1
@enzotib qberlaku untuk setiap baris di mana dieksekusi. Tetapi ketika nomor baris bukan 123, dperintah dieksekusi, dan artinya adalah untuk langsung melompat ke baris input berikutnya.
— Gilles 'SANGAT berhenti menjadi jahat'

Penjelasan sejernih kristal
— Rahul Patil

Pada dasarnya ia melakukan hal yang sama sed -n 123p(mencetak hasil yang sama) kecuali berhenti setelah baris 123 daripada memproses ribuan baris yang berpotensi tidak akan pernah melakukan apa pun dengan cara apa pun.
— Wildcard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.