Saya punya regex ini:
(?<=prefix).*$
yang mengembalikan karakter apa pun yang mengikuti string "awalan" dan berfungsi dengan baik pada mesin regex online apa pun (mis. https://regex101.com ). Masalahnya adalah ketika saya menggunakan regex itu di bash:
grep '(?<=prefix).*$' <<< prefixSTRING
itu tidak cocok dengan apa pun. Mengapa regex itu tidak berfungsi dengan grep?
grep
regular-expression
mark009
sumber
sumber
.*$
cocok dengan string apa pun hingga end-of-line (atau end-of-string), bukan hanya satu karakter.Jawaban:
Anda tampaknya telah mendefinisikan regex yang benar, tetapi tidak mengatur flag yang cukup di command-line untuk
grep
memahaminya. Karena secara defaultgrep
mendukung BRE dan dengan-E
flag itu ERE. Apa yang Anda miliki (lihat-depan) hanya tersedia dalam rasa regre PCRE yang hanya didukung di GNUgrep
dengan-P
benderanya.Dengan asumsi Anda perlu untuk mengekstrak hanya string pencocokan setelah
prefix
Anda perlu menambahkan bendera ekstra-o
untuk membiarkan tahugrep
cetak yang hanya bagian yang cocok sebagaiAda juga versi
grep
yang mendukung pustaka PCRE secara default -pcregrep
di mana Anda bisa melakukannyaPenjelasan terperinci tentang berbagai rasa regex dijelaskan dalam jawaban dan alat Giles yang luar biasa ini yang mengimplementasikan masing-masing
sumber
Ekspresi reguler datang dalam berbagai rasa. Yang Anda perlihatkan adalah ekspresi reguler Perl-like (PCRE, "Perl Compatible Regular Expression").
grep
melakukan ekspresi reguler POSIX. Ini adalah ekspresi reguler dasar (BRE) dan ekspresi reguler yang diperluas (ERE, jikagrep
digunakan dengan-E
opsi). Lihat manual untukre_format
atauregex
manual manual serupa apa pun yang dirujuk manual Andagrep
pada sistem Anda, atau teks standar POSIX yang baru saja saya tautkan.Jika Anda menggunakan GNU
grep
, Anda akan dapat menggunakan ekspresi reguler seperti Perl jika Anda menggunakan opsi spesifikgrep
GNU .grep
-P
Perhatikan juga bahwa
grep
mengembalikan garis secara default, bukan substring dari garis. Sekali lagi, dengan GNUgrep
(dan beberapagrep
implementasi lainnya ), Anda dapat menggunakan-o
opsi untuk mendapatkan hanya bit yang cocok dengan ekspresi yang diberikan dari setiap baris.Perhatikan bahwa kedua
-P
dan-o
non-standar ekstensi POSIX spesifikasigrep
.Jika Anda tidak menggunakan GNU
grep
, maka Anda dapat menggunakansed
sebagai gantinya untuk mendapatkan bit antara stringprefix
dan akhir baris:Apa yang dilakukan adalah hanya mencetak garis yang
sed
mengatur untuk menerapkan substitusi yang diberikan. Substitusi akan mengganti seluruh baris yang cocok dengan ekspresi (yang merupakan BRE), dengan potongan yang terjadi setelah stringprefix
.Perhatikan bahwa jika ada beberapa contoh
prefix
pada sebuah baris,sed
variasi akan mengembalikan string setelah yang terakhir , sedangkangrep
variasi GNU akan mengembalikan string setelah yang pertama (yang akan mencakup contoh lain dariprefix
).The
sed
solusi akan portabel untuk semua sistem Unix-seperti.sumber
Seperti jawaban lain telah menyatakan,
grep
tidak menggunakan rasa regex dengan lookbehinds (secara default dengan GNUgrep
, atau tidak sama sekali dengan versi lain).Jika Anda menemukan diri Anda tidak dapat menggunakan GNU
grep
ataupcregrep
, Anda dapat menggunakannyaperl
jika Anda memilikinya.Setara dengan baris perintah
perl
akan menjadi:Anda menempatkan regex yang diinginkan di antara garis miring. Saat Anda menggunakan Perl, ini menggunakan rasa regex Perl .
sumber
print "$&\n" if ...
jika mereka ingin menampilkan hanya bagian setelahprefix