Sebagai lanjutan dari pertanyaan ini tentang menghapus baris baru dari teks, saya ingin mengubahnya menjadi alias zsh sebagai berikut:
alias striplines=' awk " /^$/ {print \"\n\"; } /./ {printf( \" %s \",$0);}"'
Saya telah mencoba melarikan diri dari kutipan di dalam skrip awk, tetapi saya mendapatkan kesalahan ini:
awk: (FILENAME=bspsrobustness FNR=1) fatal: division by zero attempted
(File ini disebut bspsrobustness
)
Apakah ada cara untuk melakukan apa yang saya inginkan? Saya kira saya bisa mengubah ini menjadi skrip awk daripada zsh alias, apakah itu pilihan terbaik saya?
Jawaban:
Anda bisa menggunakan fungsi zsh sebagai ganti alias. Tidak ada lingkaran kutipan untuk dilewati.
sumber
striplines filename
?"$@"
dilakukannya?"$@"
sintaks mengirimkan striplines argumen untuk awk terganggu - diperlukan jika, katakanlah, setiap nama file Anda berisi spasi:striplines "file 1" "file 2"
akan mengirimkan dua nama file ke awk.Untuk mengetahui apa yang sedang terjadi, jalankan
Karena
$
karakter dalam tanda kutip ganda (ketika mereka diperluas setelah alias diperluas), mereka ditafsirkan oleh shell. Untuk mendapatkan kutipan yang benar, lebih mudah untuk menempatkan seluruh definisi alias dalam tanda kutip tunggal. Apa yang ada di dalam tanda kutip tunggal adalah apa yang akan diperluas ketika alias digunakan. Sekarang argumenawk
dikelilingi dalam tanda kutip ganda, jelas bahwa Anda perlu backslash sebelumnya\"$
.Sebuah idiom yang berguna untuk mengutip tunggal string yang dikutip tunggal adalah cara yang
'\''
cukup banyak untuk menempatkan kutipan tunggal literal dalam string yang dikutip tunggal. Secara teknis ada penjajaran string dengan tanda kutip tunggal, tanda garis miring terbalik'
, dan string tanda kutip tunggal. String kosong disandingkan''
di akhir dapat dihapus.Setelah penjelasan panjang ini, sebuah rekomendasi: ketika terlalu rumit untuk sebuah alias, gunakan sebuah fungsi .
sumber