Saya ingin melakukan hal berikut
awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}'
Tapi melarikan diri dari kutipan tunggal dengan cara ini tidak berhasil
awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}'
Bagaimana cara melakukannya? Terimakasih atas bantuannya.
'abc'd'ef'
isabcdef
: literal plusd
plus literal. Itu did
luar tanda kutip, dan Anda dapat menggantinyad
dengan\'
membuat'abc'\''ef'
yang mengevaluasi keabc'ef
.Jawaban:
Ini mungkin yang Anda cari:
Artinya, dengan
'\''
Anda menutup bukaan'
, lalu cetak literal'
dengan meloloskan diri dari itu dan akhirnya buka'
lagi.sumber
'
karakter menutup pembukaan'
literal shell tali. Literal shell tidak mendukung pelolosan garis miring terbalik untuk ini. Urutan'\''
melakukan trik: menutup single-quote literal, menspesifikasikan karakter quote (menggunakan pelarian yang adalah didukung di luar literal single-quote) dan kemudian kembali membuka sebuah single baru-kutipan literal. Anda dapat menganggapnya sebagai urutan pelolosan empat karakter untuk mendapatkan satu kutipan. :)awk
adalah murni masalah penerjemah perintah yang Anda gunakan untuk membuat baris perintah. Itu'{printf $2}'
akan berubah menjadi beberapa argumen untukexecve
panggilan sistem atau serupa, di mana itu hanya terlihat seperti string C yang diakhiri null tanpa tanda kutip tunggal. Awk tidak pernah melihat kutipannya, begitu pula sed. Anda dapat sebenarnya penggunaan tanda kutip ganda, tapi tanda kutip ganda tidak mencegah ekspansi shell dari$2
, sehingga Anda harus melarikan diri tanda dolar dengan garis miring terbalik untuk membuatnya literal:"{printf \$2}"
.sed -e "s/$FOO/$BAR/"
tidak akan berfungsi jika tujuannya adalah untuk mengganti teks literal$FOO
dengan$BAR
. Cara termudah adalahsed -e 's/$FOO/$BAR/
.awk "{ print \"abc\", \$1 }"
. Setiap kali tanda kutip ganda muncul di program awk, itu harus di-escape agar tidak menutup kutipan shell. Dan bandingkan ini:awk '{print "\\"}'
(cetak garis miring terbalik) versus apa yang diperlukan dengan tanda kutip gandaawk "BEGIN {print \"\\\\\" }"
:, Fiuh! Kedua tanda kutip harus di-escape, dan keduanya memiliki garis miring terbalik. Shell diubah\\
menjadi\
jadi kita perlu\\\\
melakukan encode\\
.Kutipan tunggal diwakili menggunakan
\x27
Seperti di
Sumber
sumber
\x27
adalah ekstensi; POSIX Awk hanya mengenali\047
. (\47
tidak apa-apa juga jika tidak diikuti dengan digit oktal.)\047
), bukan hex (\x27
), kode escape - lihat awk.freeshell.org/PrintASingleQuote .Opsi lainnya adalah meneruskan kutipan tunggal sebagai variabel awk :
Contoh yang lebih sederhana dengan penggabungan string:
sumber
sumber
\047
adalah urutan pelarian oktal untuk karakter tanda kutip tunggal, saya menemukan alternatif ini yang paling mudah dibaca.Untuk skrip kecil, cara opsional agar dapat dibaca adalah dengan menggunakan variabel seperti ini:
Saya menemukan itu mudah dalam kasus di mana saya harus menghasilkan berkali-kali karakter tanda kutip tunggal dalam output dan \ 047 membuatnya benar-benar tidak dapat dibaca
sumber