Menggunakan regex di dalam jika klausa dalam bash

10

Lihat ini jika blok:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

Ini harus mencetak "cocok", tetapi tidak. Di mana saya salah?

Majid Azimi
sumber

Jawaban:

21

Anda harus menghapus kutipan dalam pertandingan regex.

if [[ ${str} =~ m\.m ]]; then

Dari halaman bash man:

[...] Operator biner tambahan, = ~, tersedia, dengan prioritas yang sama dengan == dan! =. Ketika digunakan, string di sebelah kanan operator dianggap sebagai perluasan reguler yang diperluas dan dicocokkan sesuai (seperti dalam regex (3)). Nilai kembali adalah 0 jika string cocok dengan pola, dan 1 sebaliknya. Jika ekspresi reguler salah secara sintaksis, nilai pengembalian ekspresi kondisional adalah 2. Jika nocasematch opsi shell diaktifkan, kecocokan dilakukan tanpa memperhatikan kasus karakter alfabet. Bagian mana pun dari pola dapat dikutip untuk memaksa agar dicocokkan sebagai string.

Jadi dengan kutipan, Anda menggunakan pencocokan string yang baik-lama.

Jika Anda membutuhkan spasi dalam polanya, lepas saja:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then
Tikar
sumber
tetapi tanpa tanda kutip ganda, kita tidak bisa menggunakan karakter spasi dalam pola regex. Apakah ada solusi untuk itu?
Majid Azimi
1
Ruang harus diloloskan seperti \ .
ДМИТРИЙ МАЛИКОВ
Jika saya ingin mencari string yang diakhiri dengan nomor dinamis harus digunakan ${str} =~ "needle"[0-9]{1}atau haruskah saya gunakan ${str} =~ needle[0-9]{1}?
mgutt