NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
26/09/2024
Lượt xem

Bash Regex – Hướng dẫn chi tiết 8 cách sử dụng biểu thức chính quy

26/09/2024
25 phút đọc
Lượt xem

Đánh giá

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ố.

Bash Regex
Bash Regex

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

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, sedawk
  • Trong BRE, một số ký tự đặc biệt như ?, +, | () đượ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ư ?, +, | () đượ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ặc egrep) 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ạiKý tự đặc biệtMô 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\wKhớp với bất kỳ ký tự chữ cái, số hoặc dấu gạch dưới (_).
\WKhớ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.
\dKhớp với bất kỳ chữ số nào.
\DKhớp với bất kỳ ký tự nào không phải chữ số.
\sKhớp với bất kỳ ký tự khoảng trắng nào.
\SKhớp với bất kỳ ký tự nào không phải khoảng trắng.

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.

Sử dụng Regex trong mệnh đề If
Sử dụng Regex trong mệnh đề If

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.

Kiểm tra xem một biến có chứa bất kỳ chữ số bằng lệnh if
Kiểm tra xem một biến có chứa bất kỳ chữ số bằng lệnh if

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.

Sử dụng Regex với biến trong điều kiện If
Sử dụng Regex với biến trong điều kiện If

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.

Viết hoa mỗi chữ 'a' trong một chuỗi bắt đầu với cú pháp lệnh echo
Viết hoa mỗi chữ ‘a’ trong một chuỗi bắt đầu với cú pháp lệnh echo

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.

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
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

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”.

Thực hiện 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
Thực hiện 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

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 #.

Sử dụng Regex để tìm kiếm và thay thế trong Bash
Sử dụng Regex để tìm kiếm và thay thế trong Bash

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).

trích xuất tên miền từ URL bằng Regex trong Bash
Trích xuất tên miền từ URL bằng Regex trong Bash

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 địa chỉ IP bằng RegexĐ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.
Kiểm tra định dạng địa chỉ IP bằng Regex

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.

Kiểm tra định dạng của địa chỉ email bằng Regex trong Bash
Kiểm tra định dạng của địa chỉ email bằng Regex trong Bash

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.

Tách chuỗi bằng Regex trong Bash
Tách chuỗi bằng Regex trong Bash

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”.

Lọc văn bản bằng Regex trong Bash
Lọc văn bản bằng Regex trong Bash

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).

Script sẽ in ra thông báo "The name is Watson
Script sẽ in ra thông báo “The name is Watson

iconLư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.

Thoát các ký tự đặc biệt - Cách sử dụng regex
Thoát các ký tự đặc biệt – Cách sử dụng regex

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
Script xử lý khoảng trắng trong khi so khớp mẫu bằng cách sử dụng ký tự đặc biệt
Script xử lý khoảng trắng trong khi so khớp mẫu bằng cách sử dụng ký tự đặc biệt

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.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG