Alat dan versi yang berbeda mendukung variasi ekspresi reguler yang berbeda. Dokumentasi masing-masing akan memberi tahu Anda apa yang mereka dukung.
Ada standar sehingga seseorang dapat mengandalkan serangkaian fitur minimum yang tersedia di semua aplikasi yang sesuai.
Sebagai contoh, semua implementasi modern sed
dan grep
implementasi ekspresi reguler dasar seperti yang ditentukan oleh POSIX (setidaknya satu versi atau yang lain dari standar, tetapi standar itu belum banyak berkembang dalam hal itu dalam beberapa dekade terakhir).
Di POSIX BRE dan ERE, Anda memiliki [:alnum:]
kelas karakter. Yang cocok dengan huruf dan angka di lokal Anda (catatan yang sering mencakup lebih banyak daripada a-zA-Z0-9
kecuali lokal adalah C).
Begitu:
grep -x '[[:alnum:]_]\{1,\}'
cocok dengan satu atau lebih alnum atau _.
[\w]
diperlukan oleh POSIX untuk mencocokkan backslash atau w
. Jadi Anda tidak akan menemukan grep
atau sed
implementasi di mana itu tersedia (kecuali melalui opsi non-standar).
Perilaku untuk \w
sendiri tidak ditentukan oleh POSIX, jadi implementasi diperbolehkan untuk melakukan apa yang mereka inginkan. GNU grep
menambahkan itu sejak lama.
GNU grep
digunakan untuk memiliki mesin regexp sendiri namun sekarang menggunakan GNU libc's (meskipun ia menanamkan salinannya sendiri).
Ini dimaksudkan untuk mencocokkan alnums dan garis bawah di lokal Anda. Namun, saat ini memiliki bug karena hanya cocok dengan karakter byte tunggal (misalnya, tidak é di lokal UTF-8 meskipun itu jelas huruf dan meskipun itu cocok dengan é di semua lokal tempat é adalah satu karakter).
Ada juga \w
operator regexp di perl regexp dan di PCRE. PCRE / perl bukan ekspresi reguler POSIX, mereka hanya hal lain sama sekali.
Sekarang, dengan cara GNU grep -P
menggunakan PCRE, ia memiliki masalah yang sama seperti tanpa -P
. Itu dapat dikerjakan di sana dengan menggunakan (*UCP)
(meskipun itu juga memiliki efek samping di lokal non-UTF8).
GNU sed
juga menggunakan regex libc GNU untuk regexpsnya sendiri. Ia menggunakannya sedemikian rupa sehingga tidak memiliki bug yang sama dengan GNU grep
.
GNU sed
tidak mendukung PCRE. Ada beberapa bukti dalam kode yang telah dicoba sebelumnya, tetapi tampaknya tidak ada dalam agenda lagi.
Jika Anda ingin ekspresi reguler Perl, gunakan saja perl
.
Kalau tidak, saya akan mengatakan bahwa daripada mencoba mengandalkan fitur non-standar palsu dari implementasi khusus Anda sed
/ grep
, akan lebih baik untuk tetap dengan standar dan penggunaan [_[:alnum:]]
.
[_[:alnum:]]
adalah solusi yang bagus yang memungkinkan saya untuk memperpanjang seperti[\w/]
([_[:alnum:]/]
dalam hal ini).grep
.Anda benar -
\w
adalah bagian dari PCRE - ekspresi reguler yang kompatibel dengan perl. Ini bukan bagian dari regex 'standar'. http://www.regular-expressions.info/posix.htmlBeberapa versi
sed
mungkin mendukungnya, tapi saya sarankan cara termudah adalah dengan menggunakanperl
dalamsed
mode dengan menentukan-p
bendera. (Seiring dengan-e
). (Lebih detail dalamperlrun
)Tapi Anda tidak perlu mengikutinya
[]
dalam contoh itu - itu untuk kelompok barang yang valid.Atau di Windows:
Lihat
perlre
lebih banyak barang PCRE.Anda bisa mendapatkan perl di sini: http://www.activestate.com/activeperl/downloads
sumber
\w
dan[\w]
dalam pertanyaan saya. Saya akan memperbaruinya dengan output dari setiap perintah untuk memperjelas mana yang berfungsi dan mana yang tidak. Secara khusus,sed
mengerti\w
, tetapi tidak[\w]
. Juga, saya perlu[\w]
bekerja karena saya ingin menggunakan[\w/]
misalnya.perl
bisa melakukannya :).\w
berada di GNU grep (tahun 80-an) sebelum berada di perl dan di GNU emacs bahkan mungkin sebelum itu.Saya menduga itu
grep
dansed
memutuskan secara berbeda kapan harus menerapkan[]
dan kapan harus memperluas\w
. Dalam perl regex\w
berarti karakter kata apa pun, dan[]
tentukan grup untuk menerapkan salah satu karakter di dalamnya sebagai pasangan. Jika Anda "perluas"\w
sebelumnya,[]
itu akan menjadi kelas karakter dari semua karakter kata. Jika, sebaliknya Anda lakukan[]
pertama Anda akan memiliki kelas karakter dengan dua karakter\
danw
sehingga akan ditemukan pola yang mengandung satu atau lebih dari dua karakter.Jadi sepertinya
sed
melihat[]
dan memperlakukannya sebagai berisi karakter yang tepat untuk mencocokkan bukannya menghormati urutan khusus\w
sepertiperl
dangrep
lakukan. Tentu saja,[]
ini benar-benar tidak perlu dalam contoh ini, tetapi orang mungkin bisa membayangkan kasus-kasus di mana itu akan menjadi penting, tetapi kemudian Anda bisa membuatnya bekerja dengan orangtua dan ors.sumber
\
adalah kode pelarian, dan Anda akan menggunakannya untuk menghindari pembatas. Secara inheren itu berarti ia harus memiliki prioritas lebih tinggi daripada hal lain. Saya pikir itu lebih mungkin bahwa itu tidak dilaksanakan karena\w
bukan bagian dari spec ekspresi regulerecho whe\\ere | sed -r 's/[\w]+/gone/g
memberi sayagonehegoneere
seolah-olah itu cocok dengan masing-masing` and
w` dan melakukan substitusi