Menggunakan https://regex101.com/ saya membuat ekspresi reguler untuk mengembalikan kemunculan pertama alamat IP dalam sebuah string.
RegExp:
(?:\d{1,3}\.)+(?:\d{1,3})
RegExp termasuk pembatas:
/(?:\d{1,3}\.)+(?:\d{1,3})/
Dengan string tes berikut:
eu-west 140.243.64.99
Ini mengembalikan kecocokan penuh:
140.243.64.99
Tidak peduli apa yang saya coba dengan jangkar dll, skrip bash berikut tidak akan berfungsi dengan ekspresi reguler yang dihasilkan.
temp="eu-west 140.243.64.99 "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
echo "found a match"
else
echo "No IP address returned"
fi
bash
regular-expression
rjm61
sumber
sumber
=~
Operator dibahas di sini di manual mana itu ditulis pesta kegunaan "extended ekspresi reguler". Regex yang diperluas dijelaskan diregex(7)
halaman manual dan diringkas secara singkat di sini .Jawaban:
\d
adalah cara yang tidak standar untuk mengatakan "digit". Saya pikir itu berasal dari Perl, dan banyak bahasa dan utilitas lain mendukung RE yang kompatibel dengan Perl (PCRE) juga. (dan misalnya GNU grep 2.27 di Debian stretch mendukung kesamaan\w
untuk karakter kata bahkan dalam mode normal.)Bash tidak mendukung
\d
, jadi Anda harus menggunakan[0-9]
atau secara eksplisit[[:digit:]]
. Sama untuk grup yang tidak menangkap(?:..)
, gunakan saja(..)
.Ini harus dicetak
match
:sumber
grep
mendukung\d
tanpa-P
?\w
dan\b
, yang saya pelajari dari Perl, jadi saya bingung.\d
atau PCRE "tidak standar". Mereka cukup standar, hanya standar yang berbeda dari ekspresi reguler asli dan ekspresi reguler lanjutan.\d
. Meskipun Anda benar bahwa PCRE agak standar, atau paling tidak terdefinisi dengan baik. Masalah yang mengganggu adalah bahwa GNU grep (atau glibc) mendukung beberapa atom mirip PCRE, setidaknya\w
dan\s
ketika menafsirkan ERE, dan dalam konteks itu mereka sangat tidak standar. Ungkapan saya mungkin sebagian berasal dari itu, dan kesalahan penilaian yang\d
juga didukung oleh GNU.(:...)
dan\d
merupakan perl atau operator ekspresi reguler PCRE (seperti di GNUgrep -P
).bash
hanya mendukung ekspresi reguler yang diperluas seperti padagrep -E
kecuali untuk regexps yang diteruskan secara literal sebagai[[ text =~ regexp-here ]]
lawan dari hasil ekspansi yang tidak dikutip (seperti dalam[[ text =~ $var ]]
atau[[ test =~ $(printf '%s\n' 'regexp-here') ]]
), itu terbatas pada rangkaian fitur ekspresi reguler diperpanjang POSIX.Jadi, bahkan pada sistem yang
grep -E '\d'
berfungsi (ERE GNU telah mengimpor beberapa ekstensi dari perl regexps seperti yang\s
mungkin dimiliki versi yang akan datang\d
), Anda harus menggunakan:di
bash
untuk itu berfungsi ([[ $text =~ \d ]]
tidak akan).Untuk shell yang mendukung PCRE, Anda mungkin ingin menggunakan
zsh
:ksh93 juga mendukung penerapan ekspresi reguler seperti perl (tidak sepenuhnya kompatibel) sebagai bagian dari pencocokan pola. Di sana, Anda akan menggunakan:
(perhatikan
=
bukan=~
. Anda akan ingin menggunakan variabel sementara karena itu sangat buggy ketika Anda tidak)sumber
Situs regex101.com menggunakan PCRE (lihat sudut kiri atas) sebagai default, dan tidak memiliki dukungan untuk sintaks regex "Diperpanjang". Itu adalah "Perl Regular Regular Expresions", yang datang (seperti yang masuk akal untuk diharapkan) dari Perl.
PCRE didukung oleh beberapa alat (seperti
grep -P
) dalam beberapa kondisi, tetapi dukungan bash regex di dalam[[…]]
idiom hanya untuk perpanjangan regex (sepertigrep -E
).Di Extended regex,
(?…)
tanda kurung non-capture tidak ada, dan \ d juga hilang. Anda perlu menggunakan yang sederhana(…)
dan[0-9]
:sumber