Secara umum, karakter mana dalam ekspresi reguler yang perlu diloloskan?
Misalnya, berikut ini tidak benar secara sintaksis:
echo '[]' | grep '[]'
grep: Unmatched [ or [^
Namun, ini secara sintaksis benar:
echo '[]' | grep '\[]'
[]
Apakah ada dokumentasi tentang karakter mana yang harus diloloskan dalam ekspresi reguler, dan yang tidak?
sumber
bash
termasuk),!
masih diperluas dalam tanda kutip ganda, hanya tanda kutip tunggal yang akan menghentikan ekspansi (atau mematikan opsi shell).]
seharusnya tidak dikutip,[
tidak selalu. Saya tidak menemukan referensi ke{
dan}
Ada beberapa jenis ekspresi reguler dan himpunan karakter khusus bergantung pada jenis tertentu. Beberapa dari mereka dijelaskan di bawah ini. Dalam semua kasus, karakter khusus lolos dengan backslash
\
. Misalnya untuk mencocokkan[
Anda menulis\[
. Atau karakter (kecuali^
) dapat melarikan diri dengan melampirkan mereka di antara tanda kurung satu per satu seperti[[]
.Karakter yang spesial dalam beberapa konteks seperti
^
spesial pada awal (sub-) ekspresi dapat diloloskan dalam semua konteks.Seperti orang lain menulis: di shell jika Anda tidak menyertakan ekspresi antara tanda kutip tunggal Anda harus melarikan diri karakter khusus untuk shell di regex yang sudah lolos. Contoh: Alih-alih
'\['
Anda dapat menulis\\[
(atau:"\["
atau"\\["
) di shell Bourne yang kompatibel seperti bash tapi ini adalah cerita lain.Basic Regular Expressions (BRE)
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
Extended Regular Expressions (ERE)
grep -E
GNUsed -r
:, * BSD:sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
sumber
grep
menggunakan BRE sebagai metode regex-nya. Ada dokumentasi yang baik pada itu di sini , ikhtisar umum akan "melarikan diri karakter khusus atau metakarakter untuk mendapatkan harfiahnya, melarikan diri untuk membuat escape sequence (\n
,\r
, dll)", meskipun hal ini tidak selalu benar, misalnya, Anda harus melarikan diri(
dan)
mendapatkan makna khusus mereka (backreference).sumber
Shell dapat mengubah baris perintah sebelum eksekusi perintah. Baik shell dan
grep
dapat menggunakan mengutip untuk menghapus arti khusus dari beberapa karakter. Meskipun demikian,grep
dan kerang memiliki karakter khusus yang berbeda. Selain itu, karakter khusus yang tidak terhapuskan yang tidak dihasilkan dari ekspansi yang ada dihapus, sebelum eksekusi perintah, oleh shell.Shell mentransmisikan argumen
[]
kegrep
dan diuraikan sebagai ekspresi braket salah olehgrep
.Di atas, kita bisa melihat kasus serupa. Garis miring terbalik dihapus dan
[]
dikirim sebagai argumen untukgrep
.grep
mengenali ekspresi braket yang salah.Akhirnya, dalam kasus ini, tanda kutip dihapus oleh shell dan
\[]
ditransmisikan sebagai argumen untukgrep
tetapi, dalam kasus khusus ini ¹,\[
ditafsirkangrep
sebagai braket literal. Kutipan diperlukan untuk mencegah interpretasi backslash sebagai karakter khusus oleh shell.¹ Spesifikasi POSIX .
sumber