Tôi đang tìm cách làm một cái gì đó như thế này trong KSH:
if (( $var = (foo|bar)[0-9]*$ )); then
print "variable matched regex"
fi
Có thể ở tất cả?
Đối với bản ghi tôi đang sử dụng Ksh Version M-11/16/88i
trên máy Solaris 10.
Tôi đang tìm cách làm một cái gì đó như thế này trong KSH:
if (( $var = (foo|bar)[0-9]*$ )); then
print "variable matched regex"
fi
Có thể ở tất cả?
Đối với bản ghi tôi đang sử dụng Ksh Version M-11/16/88i
trên máy Solaris 10.
Câu trả lời:
Ksh có các biểu thức chính quy, nhưng không theo cú pháp thông thường (không có trong phiên bản trong Solaris 10 ).
if [[ $var = *@(foo|bar)*([0-9]) ]]; then …
Trong hướng dẫn sử dụng , hãy xem bên dưới các biểu thức có điều kiện của người dùng khác về những gì bên trong dấu ngoặc và bên dưới tên tập tin tạo ra tên tập tin hình chữ nhật.
=~
toán tử).
Sử dụng case
với các mẫu toàn cầu có thể làm việc cho bạn. Mẫu tổng hợp *(pattern-list)
có nghĩa là "Khớp 0 hoặc nhiều lần xuất hiện của các mẫu đã cho" và @(pattern-list)
có nghĩa là "Khớp chính xác một trong các mẫu đã cho".
matcher() {
typeset var="$1"
case "$var" in
*@(foo|bar)*([0-9])) print "$var matched" ;;
*) print "$var did not match" ;;
esac
}
for var in foo bar baz foo123 abc_foo132 abc_foo123z bar1 1bar1 1bar1a; do
matcher "$var"
done
Đầu ra:
foo matched
bar matched
baz did not match
foo123 matched
abc_foo132 matched
abc_foo123z did not match
bar1 matched
1bar1 matched
1bar1a did not match
Tại sao không sử dụng egrep (1) ? Cung cấp cho bạn tất cả người dùng regex có thể mong muốn:
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
Lưu ý bổ sung cho Solaris: Với Solaris, bạn có thể muốn kiểm tra manpage cho egrep - có phiên bản egrep được đặt tại /usr/xpg4/bin/egrep
đó hỗ trợ thêm một số tùy chọn và khác về chức năng khi nói đến công cụ regex nâng cao.
Tôi đã làm một cái gì đó như thế này, sử dụng sed
. Tôi không biết nó tốt như thế nào, nhưng ít nhất nó đã hoạt động ^^
if [ -z "$(echo "$var" | sed -e 's/(foo|bar)[0-9]*$//')" ]; then
print "variable matched regex"
fi
grep
là tự nhiên hơn , nhưng có một cách được xây dựng thành ksh .
Tôi biết tôi đến bữa tiệc muộn, nhưng thay vì giải pháp của ktf:
if echo "$var" | egrep -s '(foo|bar)[0-9]*$' # -s means "silent"
then
...
bạn cũng có thể sử dụng
if grep -q '(foo|bar)[0-9]*$' <<< "$var" # -q means "quiet" ;-)
then
...
Kỹ thuật này với <<<
toán tử được gọi là herestring . Tuy nhiên, tôi cũng nên thêm một cảnh báo : điều này KHÔNG hoạt động trong môi trường chỉ đọc (nghĩa là bạn sẽ nhận được thông báo lỗi xấu stderr
), vì việc trích dẫn này yêu cầu một tệp tạm thời được ghi vào một nơi nào đó. Theo như tôi biết, cách "cổ điển" với echo
và một đường ống cũng sẽ hoạt động mà không có sự cho phép viết nào cả.
[foo|bar]
có nghĩa là "khớp một ký tự từ tập hợp (a, b, f, o, r, |)" không? Nếu bạn có nghĩa là "khớp 'foo' hoặc 'bar'" bạn muốn(foo|bar)