Như bạn có thể đã biết, rất nhiều tính năng hỗ trợ các công cụ RegEx hiện đại (tham chiếu lại, xác nhận tìm kiếm, v.v.) không được hỗ trợ bởi công cụ Bash RegEx. Sau đây là một kịch bản Bash đơn giản mà tôi vừa tạo để cố gắng giải thích mục tiêu cuối cùng của tôi là gì:
#!/bin/bash
# Make sure exactly two arguments are passed.
if [ $# -lt 2 ]
then
echo "Usage: match [string] [pattern]"
return
fi
variable=${1}
pattern=${2}
if [[ ${variable} =~ ${pattern} ]]
then
echo "true"
else
echo "false"
fi
Vì vậy, ví dụ, một cái gì đó như lệnh sau sẽ trả về false:
. match.sh "catfish" "(?=catfish)fish"
trong khi đó cùng một biểu thức sẽ tìm thấy sự trùng khớp khi được sử dụng trong Perl hoặc trình kiểm tra regex JavaScript.
Backreferences (ví dụ (expr1) (expr2) [] \ 1 \ 2) cũng sẽ không khớp.
Tôi chỉ đơn giản là đi đến kết luận rằng vấn đề của tôi sẽ chỉ được giải quyết khi buộc bash sử dụng công cụ RegEx tương thích với Perl. Đây có phải là có thể làm được? Nếu vậy, làm thế nào tôi sẽ thực hiện các thủ tục?
grep
với -P
hoặc sử dụng sed
?
re="([a-z])[0-9]\1"; [[ a1a =~ $re ]] && echo ${BASH_REMATCH[0]}