Regex là công cụ đắc lực giúp bạn xử lý văn bản trong Bash. Với Regex, việc tìm kiếm, so khớp hay thay thế trở nên dễ dàng và hiệu quả hơn bao giờ hết. Trong bài viết này, Vietnix sẽ hướng dẫn bạn sử dụng Regex trong Bash, từ những khái niệm cơ bản đến các ví dụ thực tế và cách giải quyết những vấn đề thường gặp.
Bash Regex là gì?
Regex viết tắt của Regular Expression (biểu thức chính quy), là một chuỗi các ký tự đặc biệt được sử dụng để xác định mẫu tìm kiếm trong việc thao tác hoặc khớp mẫu văn bản. Trong Bash, Regex được sử dụng trong các lệnh như lệnh grep, sed
, lệnh awk và thậm chí trong các biểu thức điều kiện, mở rộng tham số.
Một biểu thức chính quy bao gồm một hoặc nhiều thành phần như:
- Tập hợp ký tự (Character set): Là một nhóm các ký tự cụ thể được hiểu theo nghĩa đen của chúng, không mang ý nghĩa đặc biệt nào trong Regex. Ví dụ, [abc] sẽ khớp với bất kỳ ký tự ‘a‘, ‘b‘ hoặc ‘c‘ nào trong văn bản.
- Điểm neo (Anchor): Là các ký tự đặc biệt được sử dụng để đánh dấu các vị trí cụ thể trong văn bản mà mẫu cần khớp. Các ký tự này không đại diện cho các ký tự thực tế mà chỉ cho biết vị trí bắt đầu hoặc kết thúc của mẫu trong văn bản. Dấu
^
khớp với đầu dòng và dấu$
khớp với cuối dòng là 2 điểm neo phổ biến trong Regex. - Bộ điều chỉnh (Modifier): Là các ký tự hoặc biểu tượng đặc biệt giúp mở rộng hoặc thu hẹp phạm vi khớp của mẫu Regex. Một số modifier phổ biến trong Regex bao gồm
*, +, ?.
Với vai trò là một shell (môi trường thực thi lệnh) trên các hệ điều hành Linux, Bash được xem là công cụ hỗ trợ hữu ích trong việc sử dụng Regex thông qua thực hiện, chạy tập lệnh Bash (script). Ngoài ra, Bash còn được xem như là một lệnh hữu ích trên hệ thống hệ điều hành – lệnh bash.
Bên cạnh đó, bạn có thể tìm hiểu thêm: Bash có phải là ngôn ngữ lập trình
2 loại Regex trong Bash
Biểu thức chính quy cơ bản (BRE)
- BRE là loại Regex mặc định được sử dụng trong nhiều tiện ích Unix truyền thống như
grep
,sed
vàawk
. - Trong BRE, một số ký tự đặc biệt như
?, +, |
và()
được hiểu theo nghĩa đen trừ khi được thêm dấu\
phía trước. - BRE phù hợp với các tác vụ khớp mẫu cơ bản và được hỗ trợ rộng rãi trên các hệ thống dựa trên Unix.
Biểu thức chính quy mở rộng (ERE)
- ERE là phiên bản nâng cao của BRE, cung cấp nhiều ký tự đặc biệt và tính năng phong phú hơn.
- Trong ERE, các ký tự đặc biệt như
?, +, |
và()
được hiểu theo nghĩa đặc biệt của chúng mà không cần dấu\
. - ERE hỗ trợ các tính năng bổ sung như số lượng từ
(?, +, {})
và tham chiếu ngược(\1, \2,...).
- Các tiện ích như
grep -E
(hoặcegrep
) vàsed -E
hỗ trợERE
một cách rõ ràng. - ERE cho phép tạo các mẫu Regex ngắn gọn và linh hoạt hơn so với BRE, phù hợp cho các tác vụ khớp mẫu và xử lý văn bản phức tạp.
Tóm lại, BRE phù hợp cho các tác vụ khớp mẫu đơn giản và được hỗ trợ rộng rãi, trong khi ERE cung cấp nhiều tính năng mạnh mẽ hơn cho các tình huống phức tạp. Lựa chọn loại Regex phù hợp phụ thuộc vào yêu cầu cụ thể của bạn.
9 loại ký tự tự đặc biệt trong Regex
Ký tự đặc biệt trong Regex cho phép bạn thực hiện các thao tác như khớp mẫu, thay thế và thao tác văn bản.
Loại | Ký tự đặc biệt | Mô tả |
---|---|---|
Ký tự đại diện (Wildcard Character) | * | Khớp với 0 hoặc nhiều lần xuất hiện của ký tự đứng trước. Ví dụ: * .txt khớp với tất cả các file có phần mở rộng “.txt”. |
? | Khớp với bất kỳ ký tự đơn lẻ nào. Ví dụ: file?.txt khớp với “file1.txt”, “file2.txt”,… | |
[ ] | Khớp với bất kỳ ký tự nào nằm trong dấu ngoặc vuông. Ví dụ: [abc] khớp với “a”, “b” hoặc “c”. | |
Anchor | ^ | Khớp với đầu dòng hoặc chuỗi. Ví dụ: ^abc khớp với dòng bắt đầu bằng “abc”. |
$ | Khớp với cuối dòng. Ví dụ: abc$ khớp với dòng kết thúc bằng “abc”. | |
Thoát ký tự (Escape) | \ | Thoát khỏi ký tự sau. Ký tự đứng sau \ sẽ được hiểu theo nghĩa đen. Ví dụ: \* khớp với ký tự “*”. |
Bộ định lượng (Quantifier) | + | Khớp với 1 hoặc nhiều lần xuất hiện của ký tự đứng trước. |
{ } | Chỉ định số lần xuất hiện chính xác hoặc một phạm vi. Ví dụ: a{2} khớp với “aa” và a{2,4} khớp với “aa”, “aaa” hoặc “aaaa”. | |
Phủ định (Negation) | [^ ] | Phủ định lớp ký tự và khớp với bất kỳ ký tự nào không nằm trong dấu ngoặc vuông. Ví dụ: [^0-9] khớp với bất kỳ ký tự nào không có chữ số. |
Nhóm (Grouping) | () | Nhóm mẫu lại với nhau và cho phép các quantifier áp dụng cho toàn bộ nhóm. Ví dụ: (abc)+ khớp với “abc”, “abcabc”,… |
Sự luân phiên (Alternation) | | | Biểu thị sự thay đổi, cho phép khớp với mẫu bên trái hoặc mẫu bên phải. Ví dụ: cat|dog khớp với “cat” hoặc “dog”. |
Ký tự đặc biệt (Special Character) | . | Khớp với bất kỳ ký tự nào ngoại trừ ký tự xuống dòng. Ví dụ: a.b khớp với “aab”, “acb”,… nhưng không khớp với “a\nb”. |
Chuỗi cho các ký tự phổ biến | \w | Khớp với bất kỳ ký tự chữ cái, số hoặc dấu gạch dưới (_). |
\W | Khớp với bất kỳ ký tự nào không phải chữ cái, số hoặc dấu gạch dưới. | |
\d | Khớp với bất kỳ chữ số nào. | |
\D | Khớp với bất kỳ ký tự nào không phải chữ số. | |
\s | Khớp với bất kỳ ký tự khoảng trắng nào. | |
\S | Khớp với bất kỳ ký tự nào không phải khoảng trắng. |
6 cách sử dụng Regex trong Bash
Cách 1: Sử dụng Regex trong mệnh đề If
Trong Bash, Regex có thể được sử dụng bên trong câu lệnh if để tìm kiếm hoặc so khớp mẫu. Ví dụ, để kiểm tra phần mở rộng của tên file, bạn có thể sử dụng regex trong câu lệnh if với cú pháp chạy script Bash (chạy song song lệnh Bash) như sau:
#!/bin/bash
filename="filex.txt"
if [[ "$filename" =~ \.txt$ ]]; then
echo "Filename has a .txt extension"
else
echo "Filename does not have a .txt extension"
fi
Giải thích:
- Script kiểm tra xem tên file được lưu trữ trong biến filename có kết thúc bằng phần mở rộng .txt hay không.
- Script sử dụng câu lệnh điều kiện if với toán tử =~, để so khớp mẫu với Regex.
- Biểu thức \.txt$ khớp với tên file kết thúc bằng phần mở rộng .txt.
- Dấu chấm (.) cần được thoát bằng dấu gạch chéo ngược (\) vì có ý nghĩa đặc biệt trong Regex (khớp với bất kỳ ký tự nào).
- Dấu $ neo mẫu vào cuối chuỗi.
Nếu tên file khớp với mẫu, câu lệnh echo đầu tiên “Filename has a .txt extension” sẽ được thực thi. Ngược lại câu lệnh echo thứ hai “Filename does not have a .txt extension” sẽ được thực thi.
Kết quả: Script in ra kết quả sau khi khớp mẫu (\.txt) với phần mở rộng của file.
Cách 2: Sử dụng Regex phủ định trong điều kiện If
Regex phủ định khớp với mọi thứ ngoại trừ mẫu được đề cập. Ví dụ, để kiểm tra xem một biến có chứa bất kỳ chữ số nào hay không, bạn có thể sử dụng Regex phủ định trong điều kiện if
. Dưới đây là cách đoạn script hoạt động:
#!/bin/bash
string="Hello, world!"
#print the string
echo "The string: $string"
echo
#check the string
if ! [[ "$string" =~ [0-9] ]]; then
echo "String does not contain any digits"
else
echo "String contains at least one digit"
fi
Giải thích:
- Biểu thức if ! [[ “$string” =~ [0-9] ]]; then khởi tạo một câu lệnh điều kiện.
- Toán tử =~ cho phép so khớp mẫu biểu thức chính quy trong Bash.
- Biểu thức chính quy [0-9] tìm kiếm bất kỳ chữ số nào từ 0 đến 9 trong chuỗi.
- Toán tử phủ định ! đảo ngược điều kiện, làm cho điều kiện đó đúng khi không tìm thấy chữ số nào trong chuỗi.
Kết quả: Output hiển thị kết quả sau khi kiểm tra xem chuỗi có chứa bất kỳ số nào không bằng cách sử dụng Regex phủ định.
Cách 3: Sử dụng Regex với biến trong điều kiện If
Trong Bash, bạn có thể lưu trữ các mẫu Regex trong các biến để sử dụng lại dễ dàng. Cú pháp để tạo biến là variable_name=”pattern”. Sau đó, bạn có thể sử dụng biến này trong điều kiện của câu lệnh if với định dạng “string” =~ $variable_name. Ví dụ:
#!/bin/bash
pattern="[a-z]+"
#Amtching the pattern with the string
if [[ "hello" =~ $pattern ]]; then
echo "String matches the regex pattern"
else
echo "String does not match the regex pattern"
fi
Giải thích:
Trong đoạn code này, [a-z] đại diện cho tất cả các chữ cái viết thường từ ‘a’ đến ‘z’. Ký hiệu ‘+’ nghĩa là có thể có một hoặc nhiều chữ cái như vậy liên tiếp. Nếu chuỗi “hello” phù hợp với mẫu được xác định trong biến pattern, thì điều kiện if [[ “hello” =~ $pattern ]] sẽ trả về đúng.
Kết quả: Vì chuỗi “hello” khớp với mẫu Regex [a-z]+ đã được định nghĩa, đoạn script sẽ in ra kết quả như hình minh hoạ bên dưới.
Cách 4: Sử dụng Regex với lệnh sed
Lệnh sed
là một tiện ích mạnh mẽ để thực hiện các biến đổi văn bản trên một luồng input (một chuỗi văn bản) hoặc các file. Lệnh này có thể thực hiện biến đổi văn bản với sự trợ giúp của Regex. Dưới đây là một ví dụ về việc viết hoa mỗi chữ ‘a’ trong một chuỗi bắt đầu với cú pháp lệnh echo:
echo "apple banana cherry" | sed 's/a/A/g'
Giải thích:
Trong đoạn code trên, lệnh sed được sử dụng với biểu thức chính quy để thay thế văn bản. Chuỗi “apple banana cherry” được đưa vào lệnh seb và biểu thức ‘s/a/A/g’ được sử dụng để thay thế tất cả các lần xuất hiện của chữ “a” thường bằng chữ “A” hoa
Kết quả: Đoạn script sẽ in ra kết quả sau khi thay thế tất cả các chữ ‘a’ thường bằng chữ ‘A’ hoa: Apple bAnAnA cherry.
Cách 5: Sử dụng Regex với lệnh awk
Lệnh awk
là một công cụ mạnh mẽ để xử lý văn bản, trích xuất dữ liệu và tạo báo cáo, cung cấp cú pháp ngắn gọn và linh hoạt để xử lý dữ liệu có cấu trúc.
Ví dụ, bạn có 1 file văn bản có tên data.txt với nội dung sau:
apple 10
banana 20
cherry 30
Để trích xuất các dòng mà cột thứ hai chứa số 20 bằng cách sử dụng Regex với lệnh awk, bạn hãy làm theo đoạn script bên dưới:
#!/bin/bash
# Extract lines where the second column contains the number "20" from data.txt
awk '$2 ~ /20/ {print}' data.txt
Giải thích:
Trong lệnh ‘$2 ~ /20/’, ‘$2’ chỉ vào cột thứ hai của mỗi dòng dữ liệu, dấu “~” có nghĩa là tìm kiếm và so sánh. ‘/20/’ là mẫu tìm kiếm để tìm chuỗi. Cuối cùng, ‘{print}’ là lệnh in ra kết quả khi tìm thấy chuỗi đó.
Kết quả: Script in ra dòng chứa số “20” như đã định nghĩa trong biểu thức chính quy.
Cách 6: Sử dụng Regex với lệnh grep
Lệnh grep
là một công cụ được sử dụng để tìm kiếm các file văn bản hoặc luồng input cho các dòng khớp với một mẫu được chỉ định. Lệnh grep
cùng với Regex có thể tìm kiếm các dòng chứa một mẫu cụ thể.
Giả sử bạn có một file trong thư mục hiện tại có tên là example.txt với nội dung sau:
apple
banana
grape
apricot
watermelon
Lệnh grep
sau đây sẽ thực hiện tìm kiếm “apple
” và “apricot
” với Regex trong file:
grep 'apple\|apricot' example.txt
Kết quả: Lệnh trên sẽ hiển thị các dòng trong file example.txt chứa từ “apple” hoặc “apricot”.
Sử dụng Regex để tìm kiếm và thay thế trong Bash
Regex có khả năng xác định các mẫu hoặc chuỗi con cụ thể trong văn bản. Sau đó, regex có thể được sử dụng để thay thế văn bản hoặc mẫu đã xác định bằng một chuỗi thay thế khác.
Ví dụ: Để tìm kiếm tất cả các nguyên âm trong một văn bản và thay thế chúng bằng ký tự đặc biệt #, bạn có thể sử dụng đoạn script:
#!/bin/bash
# Input string
input="The quick brown fox jumps over the lazy dog."
# Perform search and replace using regex
output=$(echo "$input" | sed 's/[aeiou]/#/g')
# Print the modified string
echo "$output"
Giải thích:
Tập lệnh này sử dụng lệnh sed cùng với một biểu thức chính quy để thực hiện thao tác tìm kiếm và thay thế. Cụ thể, tập lệnh thay thế tất cả các ký tự nguyên âm viết thường (a, e, i, o, u) bằng ký tự #. Biểu thức chính quy [aeiou] khớp với bất kỳ nguyên âm viết thường đơn lẻ nào, và cú pháp s/// của lệnh sed thay thế mỗi kết quả khớp bằng ký tự #.
Kết quả: Script sẽ in ra chuỗi “Th# qu#ck br#wn f#x jumps #v#r th# lazy d#g.”, trong đó tất cả các nguyên âm đã được thay thế bằng dấu #.
Cách trích xuất tên miền từ URL bằng Regex trong Bash
Trong một URL, tên miền là phần chính xác định website. Để trích xuất tên miền từ URL, bạn có thể sử dụng Regex trong Bash. Script này sẽ xác định và tách phần chính đại diện cho tên miền, đồng thời loại bỏ các thành phần không cần thiết như giao thức (http://, https://), đường dẫn (path) và các tham số truy vấn (query parameters).
Để trích xuất tên miền từ URL, bạn có thể sử dụng cú pháp sau:
if [[ "$url" =~ ^https?://([^/]+) ]]; then domain=”${BASH_REMATCH[1]}”
Ví dụ:
#!/bin/bash
# URL
url="https://www.example.com/path/to/page?param=value"
# Extract domain using regex
if [[ "$url" =~ ^https?://([^/]+) ]]; then
domain="${BASH_REMATCH[1]}"
echo "Domain name: $domain"
else
echo "Invalid URL"
fi
Giải thích:
Tập lệnh này sử dụng lệnh sed cùng với một biểu thức chính quy để thực hiện thao tác tìm kiếm và thay thế. Cụ thể, tập lệnh thay thế tất cả các ký tự nguyên âm viết thường (a, e, i, o, u) bằng ký tự #. Biểu thức chính quy [aeiou] khớp với bất kỳ nguyên âm viết thường đơn lẻ nào, và cú pháp s/// của lệnh sed thay thế mỗi kết quả khớp bằng ký tự #.
Kết quả: Đoạn script sẽ in ra tên miền được trích xuất từ URL (Domain name: www.example.com).
Kiểm tra định dạng địa chỉ IP bằng Regex trong Bash
Để kiểm tra định dạng của địa chỉ IP bằng Regex trong Bash, bạn có thể tạo một mẫu Regex khớp với các địa chỉ IP hợp lệ.
Ví dụ:
#!/bin/bash
# IP address
ip="192.168.277.1"
echo "The ip address: $ip"
echo
# Regex pattern for IP address format
regex='^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'
# Check if IP address matches the regex pattern
if [[ $ip =~ $regex ]]; then
echo "Valid IP address"
else
echo "Invalid IP address"
fi
Giải thích:
Đoạn code trên sử dụng biểu thức regex [[ “$url” =~ ^https?://([^/]+) ]] kiểm tra URL bắt đầu bằng “http://” hoặc “https://” tiếp theo là phần tên miền. Phần tên miền được trích xuất bằng cách sử dụng ([^/]+) khớp với một hoặc nhiều ký tự không phải dấu gạch chéo (/). Trong đoạn code, gán tên miền đã khớp vào biến domain bằng ${BASH_REMATCH[1]}, trích xuất nội dung của nhóm bắt đầu đầu tiên.
Kết quả: Vì địa chỉ IP 192.168.277.1 có octet thứ ba là 277 (ngoài phạm vi cho phép từ 0 đến 255) nên script sẽ in ra kết quả là: Invalid IP address.
Kiểm tra định dạng của địa chỉ email bằng Regex trong Bash
Để kiểm tra định dạng của một địa chỉ email bằng Regex trong Bash, bạn có thể tạo một mẫu Regex khớp với các địa chỉ email hợp lệ.
Một Regex để kiểm tra định dạng email là [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$.
Ví dụ:
#!/bin/bash
read -p "Enter email: " email
#regex pattern for email address format
regex='^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
if [[ "$email" =~ $regex]]; then
echo "Valid email address"
else
echo "Invalid email address"
fi
Giải thích:
Đoạn code trên yêu cầu người dùng nhập địa chỉ email, sau đó lưu địa chỉ này vào biến email. Biểu thức chính quy ^[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$ bao gồm hai phần chính: phần địa chỉ trước dấu “@” và phần tên miền sau dấu “@”. Phần địa chỉ trước dấu “@” cho phép sử dụng chữ cái, số và một số ký tự đặc biệt như “.”, “”, “%”, “+” và “-“. Phần tên miền sau dấu “@” cho phép sử dụng chữ cái, số và dấu gạch ngang, và yêu cầu kết thúc bằng một dấu chấm và ít nhất hai chữ cái (ví dụ: “.com”, “.org”,…).
Kết quả: Trong hình minh hoạ bên dưới, script phát hiện địa chỉ email không hợp lệ vì địa chỉ email không chứa ký tự “@” nên in ra kết quả là Invalid email address.
Tách chuỗi bằng Regex trong Bash
Việc tách chuỗi bằng Regex trong Bash chính là chia 1 chuỗi thành các phần nhỏ hơn dựa trên 1 mẫu hoặc dấu phân cách được xác định. Bạn có thể sử dụng Regex với các hàm như grep, sed hoặc awk để tách chuỗi.
Để tách chuỗi bằng Regex cùng với lệnh grep trong Bash, bạn sử dụng script sau:
#!/bin/bash
text="apple,banana,orange,grape"
delimiter=","
#print the string
echo "The text:"
echo $text
echo
echo "The text after splitting"
# Splitting the text using grep and regex
echo "$text" | grep -oE "[^$delimiter]+"
Giải thích:
Chuỗi văn bản có chứa các giá trị được phân tách bằng dấu phẩy. Lệnh grep với tùy chọn -oE được sử dụng để tìm và in ra các đoạn văn bản không chứa dấu phân tách cụ thể. Biểu thức chính quy [^$delimiter]+ khớp với một hoặc nhiều ký tự không phải là dấu phân tách đã chỉ định.
Kết quả: Script sẽ in ra chuỗi gốc và sau đó In ra từng phần của chuỗi đã được tách ra trên một dòng mới.
Lọc văn bản bằng Regex trong Bash
Lọc văn bản bằng Regex là việc chọn hoặc loại trừ các dòng hoặc khối văn bản dựa trên mẫu được chỉ định. Để lọc văn bản, bạn sử dụng lệnh grep với 1 mẫu regex theo sau là tên file.
Giải thích:
Chuỗi văn bản có chứa các giá trị được phân tách bằng dấu phẩy. Lệnh grep với tùy chọn -oE được sử dụng để tìm và in ra các đoạn văn bản không chứa dấu phân tách cụ thể. Biểu thức chính quy [^$delimiter]+ khớp với một hoặc nhiều ký tự không phải là dấu phân tách đã chỉ định.
Giả sử, bạn có một file data.txt với nội dung sau:
apple 100
banana 150
orange 200
apple 50
grape 250
apple 60
Bạn sử dụng script sau để lọc các dòng từ file data.txt chứa văn bản “apple”:
#!/bin/bash
# Text file with some data
file="data.txt"
# Filter lines containing "apple" using grep
grep "apple" "$file"
Giải thích:
Đoạn code này dùng lệnh grep để tìm và in ra những dòng trong file “data.txt” mà có chữ “apple”.
Kết quả: Script sẽ in ra các dòng trong file data.txt chứa từ “apple”.
Cách sử dụng Regex trong so khớp văn bản
Bạn có thể sử dụng Regex trong câu lệnh if
để so khớp văn bản. Trong tác vụw này, có 2 trường hợp có thể xuất hiện đó là:
- So khớp phân biệt chữ hoa chữ thường
- So khớp không phân biệt chữ hoa chữ thường.
Để so khớp văn bản bằng Regex, bạn sử dụng script sau:
#!/bin/bash
name="Watson"
shopt -s nocasematch
if [[ $name =~ ^watson$ ]]; then
echo "The name is Watson (case-insensitive)."
else
echo "The name is not Watson (case-insensitive)."
fi
Giải thích:
Script này kiểm tra xem tên biến là “watson” hay không, bất kể viết hoa hay viết thường. Nếu tên biến đúng là “watson,” script sẽ tiếp tục thực hiện các lệnh tiếp theo.
Kết quả: Script sẽ in ra thông báo “The name is Watson (case-insensitive).” vì chuỗi name chứa từ “Watson” (không phân biệt chữ hoa chữ thường).
Lưu ý
Nếu bạn muốn lệnh trên phân biệt chữ hoa chữ thường, bạn cần xóa bỏ dòng lệnh shopt -s nocasematch trong đoạn code.
Mẹo sử dụng Regex
Tuy Regex có nhiều ưu điểm nhưng việc sử dụng Regex cũng có thể gặp một số khó khăn và vấn đề như thoát ký tự đặc biệt, xử lý khoảng trắng,… Dưới đây là các mẹo giúp bạn khắc phục các vấn đề này hiệu quả.
Thoát các ký tự đặc biệt
Trong Regex, một số ký tự có ý nghĩa đặc biệt như ^, $, \
. Để tìm kiếm chính xác những ký tự này, bạn cần đặt thêm một dấu gạch chéo ngược (\) trước ký tự đó.
Ví dụ: Để tìm kiếm dấu *, bạn cần dùng mẫu \*.
Dưới đây là ví dụ về cách thoát các ký tự đặc biệt trong mẫu Regex:
#!/bin/bash
string='The cost is $100'
pattern='\$100'
if [[ $string =~ $pattern ]]; then
echo 'Match found'
else
echo 'Match not found'
fi
Giải thích:
Trong script, mẫu regex \$100 sử dụng dấu gạch chéo ngược \ để thoát dấu $, đảm bảo dấu $ được coi là một ký tự chữ khi so khớp mẫu.
Khi sử dụng Regex, các ký tự khoảng trắng (như dấu cách, tab) có thể gây ra các lỗi không mong muốn. Để xử lý các vấn đề này, bạn có thể sử dụng lớp ký tự [:space:]
hoặc đặc biệt character \s
. Dưới đây là ví dụ để xử lý khoảng trắng khi so khớp mẫu bằng Regex:
Xử lý khoảng trắng
#!/bin/bash
string='Regex in action'
pattern='Regex in action'
#print the string and the pattern
echo "The string: $string"
echo "The regex pattern: $pattern"
echo
if [[ $string =~ $pattern ]]; then
echo 'Match found'
else
echo 'Match not found'
fi
echo
echo "Handling whitespace"
new_pattern='Regex\s+in\s+action'
echo "The new regex pattern: $new_pattern"
echo
if [[ $string =~ $new_pattern ]]; then
echo 'Match found'
else
echo 'Match not found'
fi
Ngoài ra, bạn cũng có thể sử dụng lớp ký tự [:space:] để xử lý khoảng trắng trong Regex như sau:
#!/bin/bash
string='Regex in action'
pattern='Regex[[:space:]]+in[[:space:]]+action'
if [[ $string =~ $pattern ]]; then
echo 'Match found'
else
echo 'Match not found'
fi
Giải thích:
Đoạn code trên sử dụng biểu thức regex [[ “$url” =~ ^https?://([^/]+) ]] kiểm tra URL bắt đầu bằng “http://” hoặc “https://” tiếp theo là phần tên miền. Phần tên miền được trích xuất bằng cách sử dụng ([^/]+) khớp với một hoặc nhiều ký tự không phải dấu gạch chéo (/). Trong đoạn code, gán tên miền đã khớp vào biến domain bằng ${BASH_REMATCH[1]}, trích xuất nội dung của nhóm bắt đầu đầu tiên.
Câu hỏi thường gặp
Có thể sử dụng biểu thức chính quy để kiểm tra sự tồn tại của một mẫu trong một chuỗi không?
Có thể. Bạn có thể kiểm tra bằng các lệnh:
1. Lệnh grep
2. Lệnh sed
3. Biểu thức chính quy trong Script Bash.
Có thể sử dụng biểu thức chính quy để phân tích cú pháp của một ngôn ngữ lập trình không?
Có thể. Bạn có thể phân tích cú pháp NNLT với những ưu điểm như tính linh hoạt mạnh mẽ; dễ sử dụng; nhiều công cụ hỗ trợ.
Lời kết
Bài viết đã cung cấp cái nhìn tổng quan về Regex và cách sử dụng Regex trong Bash, bao gồm cách thức hoạt động, chức năng và mẹo để xử lý một số vấn đề thường gặp. Hy vọng thông tin này sẽ hữu ích cho bạn và giúp bạn sử dụng Regex một cách hiệu quả trong các tác vụ liên quan đến văn bản.