$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere
sed
Perintah di atas menggantikan karakter baris baru dengan string "string". Tapi saya tidak tahu arti dari :a;$!N;s/\n/string/;ta
kutipan tunggal. Saya tahu bagian tengah s/\n/string/
. Tapi saya tidak tahu fungsi bagian pertama ( :a;$!N;
) dan terakhir ( ta
).
sed
text-processing
Avinash Raj
sumber
sumber
Jawaban:
Ini adalah,
sed
perintah yang diakui samar ,. Khusus (dariman sed
):Jadi, skrip yang Anda poskan dapat dipecah menjadi (spasi ditambahkan untuk dibaca):
Pada dasarnya, apa yang dilakukan ini dapat ditulis dalam pseudocode sebagai
Anda dapat memahami ini sedikit lebih baik dengan contoh input yang lebih kompleks:
Saya tidak begitu yakin mengapa
!$
ini diperlukan. Sejauh yang saya tahu, Anda bisa mendapatkan hasil yang samasumber
$!
bukan!$
. Namun, mungkin juga!N
dan tidak$!
.!N
atau$!
. Jadi, saya masih terus berpikir bahwa mencari apakah baris terakhir adalah baris baru atau EOF.$!
sebagai 'rentang' alamat dengan operator komplemen postfix - jadi$!N
(lakukan diN
mana - mana kecuali alamat$
) benar-benar sintaks yang sama dengan sesuatu sepertim,n!d
(hapus semuanya kecuali barism
ken
).:
adalah analog darigoto
label, dan sebenarnya:
dulunya merupakan label goto dalam cangkang Thompson, jadi itu akan menjadi biasa bagi orang-orang di masa lalu yang menggunakan cangkang sed dan ThompsonSaya posting jawaban ini karena saya melihat banyak kebingungan tentang mengapa baris terakhir dikeluarkan ketika menjalankan
N
(melalui jalur menangani tali$!
) dan karena OP bingung tentang makna:a;$!N;
di sebuah perintah sed , tidak hanya di dalam satu spesifik ia diposting .Nah, manfaat menggunakan
$!N
bukannyaN
tidak berlaku dalam contoh yang diusulkan (oleh OP dan oleh @terdon), karena tidak ada perintah "penting" (terus membaca) dilakukan pada baris terakhir setelahN
perintah. (Memang, hasilnya sama jika salah satu strip yang alamat baris off.)Dalam contoh yang lebih kompleks (misalnya, mengganti
this sentence
dalam file, dengan dua kata yang kadang-kadang muncul pada satu baris dan beberapa kali lainnya pada dua baris), tidak termasuk baris terakhir untukN
perintah bisa jadi sangat penting! Jika baris terakhir tidak dikecualikan, setelah dieksekusiN
di atasnya,sed
hitsEOF
dan segera keluar, mencegah semua perintah berikutnya (percabangan juga, yaitut
danb
) dieksekusi.Dalam contoh yang terlalu sederhana yang ditunjukkan, kita dapat dengan aman menghapus
$!
dan membiarkansed
kegagalan dalam mengeksekusiN
dan kembali karenas
perintah yang dibatalkan tidak akan melakukan apa pun jika dieksekusi, karena tidak ada yang\n
cocok.sumber