Bash RegEx trên OSX Vs Linux (số lẻ)


4

Đây là về phát triển Bash và mã hóa các tập lệnh Bash di động sử dụng RegEx .

Sử dụng Bash RegEx, trên máy Mac, tôi có thể làm điều này:

coconut-mac$ a='bananacoconutman'; [[ "$a" =~ banana(.*?)man ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut

Tốt đẹp. Hữu ích ở nhiều nơi. Như.

Khi tôi thử làm điều này, nó thất bại:

coconut-mac$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}

Lệnh chính xác tương tự chạy hoàn hảo trên chim cánh cụt:

coconut-linux$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut
  • Tại sao?
  • Làm thế nào để sửa nó để làm cho kịch bản di động?

EDIT : Trên máy Mac:

OS X version: 10.8.2
Bash version: 4.2.37(2)-release

trên Ubuntu 12.04 LTS:

Linux kernel version: 3.2.0-29-generic-pae
Linux version: Ubuntu 12.04.1 LTS
Bash version: 4.2.24(1)-release

Phiên bản nào của grep bạn đang sử dụng trên mỗi hệ thống? Không có phiên bản duy nhất của Linux - bạn đang sử dụng hương vị / phiên bản nào?
Matt Ball

s / grep / bash />.>
Ignacio Vazquez-Abrams

Câu trả lời:


4

Trên máy Mac của tôi, info bash / =~ RETnói:

Một toán tử nhị phân bổ sung, =~', is available, with the same precedence as== 'và `! ='. Khi được sử dụng, chuỗi bên phải của toán tử được coi là biểu thức chính quy mở rộng và khớp với nhau (như trong regex3)).

man 3 regex nói:

Một toán tử lặp lại ( ?',* ', +', or bounds) cannot follow another repetition operator. A repetition operator cannot begin an expression or subexpression or follow^' hoặc `| '.

Tôi không thấy bất kỳ tài liệu tương tự nào trong GNU regex man 3 regexhay info regex.

Nếu tôi xóa ?từ bạn (.*?)và thực hiện các thao tác sau, nó sẽ hoạt động trên cả hai hệ điều hành:

$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut

Rất vui được viết lên !!
Robottinosino

3

Đây có lẽ sẽ là câu trả lời:

Bash mặc định trên Darwin (10.8.1 / 2):

GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)

Bash mặc định, giả sử, Ubuntu 12 LTS:

GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)

Làm cho nó di động sẽ là bước ra khỏi quirks bash mới hơn và sử dụng những thứ như sed, awk, không có điều gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.