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?

Eugene Yarmash
sumber

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
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