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?
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:
Dalam bahasa Inggris, sed
program 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);d
perintah 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
{d;q;}
, tidak seharusnya q
berlaku untuk setiap baris (jadi hanya yang pertama)?
q
berlaku untuk setiap baris di mana dieksekusi. Tetapi ketika nomor baris bukan 123, d
perintah dieksekusi, dan artinya adalah untuk langsung melompat ke baris input berikutnya.
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.
!
terhubung ked
, bukan123
.