Tôi đã nghiên cứu điều này rất nhiều, nhưng tôi vẫn chưa rõ về nó. Làm những gì từ ranh giới nghĩa là gì? Nó làm gì?
Vì vậy, ví dụ, ai đó có thể giải thích lệnh này cho tôi không?
egrep '\b[A-Z]+\b' filename.sh
Tôi đã nghiên cứu điều này rất nhiều, nhưng tôi vẫn chưa rõ về nó. Làm những gì từ ranh giới nghĩa là gì? Nó làm gì?
Vì vậy, ví dụ, ai đó có thể giải thích lệnh này cho tôi không?
egrep '\b[A-Z]+\b' filename.sh
Câu trả lời:
Như được mô tả ở đây , ví dụ, nó khớp giữa các từ:
Có ba vị trí khác nhau đủ điều kiện làm ranh giới từ:
- Trước ký tự đầu tiên trong chuỗi, nếu ký tự đầu tiên là ký tự từ.
- Sau ký tự cuối cùng trong chuỗi, nếu ký tự cuối cùng là ký tự từ.
- Giữa hai ký tự trong chuỗi, trong đó một ký tự là từ và ký tự kia không phải là ký tự từ.
Dưới đây là ví dụ về từng trường hợp:
Đối với chuỗi foobar
, trường hợp đầu tiên khớp
foobar
^-----here
Đối với chuỗi foobar
, trường hợp thứ hai khớp
foobar
^--here
Đối với chuỗi foo bar
, trường hợp thứ ba sẽ khớp
foo bar
^--here, because space is not a word character
Những gì đủ điều kiện là một ký tự từ phụ thuộc vào việc thực hiện biểu thức chính quy cụ thể. Tuy nhiên, trong mọi trường hợp, chữ cái ( [a-z]
và [A-Z]
), số ( [0-9]
) và _
được coi là ký tự từ.
Vì vậy, ví dụ regex bạn đã đăng ( \b[A-Z]+\b
) có nghĩa là tìm chuỗi dài nhất nằm giữa hai ranh giới từ và chỉ bao gồm các chữ cái viết hoa. Có thể dễ dàng hơn để giải thích bằng ví dụ:
echo "FOOBAR" | egrep '\b[A-Z]+\b' # Works
echo "FOO BAR" | egrep '\b[A-Z]+\b' # Works
echo "aFOOBARb" | egrep '\b[A-Z]+\b' # Does not work, we want capitals only
echo "12345" | egrep '\b[A-Za]+\b' # Does not work, no letters
echo "1FOOBAR2" | egrep '\b[A-Z]+\b' # Does not work, 1 and 2 are word chars
echo "_FOOBAR_" | egrep '\b[A-Z]+\b' # Does not work, _ is a word char
echo "#FOOBAR$" | egrep '\b[A-Z]+\b' # Works, # and $ are not word chars
egrep
(cũng không /usr/xpg4/bin/egrep
) không đối xử \b
theo cách này. Ví dụ, echo "FOOBAR" | egrep '\b[A-Z]+\b'
sẽ không phù hợp.
egrep '\b[A-Z]+\b' filename.sh
Hãy phá vỡ nó:
[A-Z]
đại diện cho bất kỳ một nhân vật trong lớp nhân vật
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]
.[A-Z]+
đại diện cho một hoặc nhiều sự xuất hiện của các ký tự chữ hoa Ví dụ trận đấu sẽ là: A
, HELLO
, IS
, I
, ELEPHANT
,, vv'\bINDIA\b'
: chính xác giống như tìm kiếm WHOLE WORD cho từ INDIA
in hoa. Nó sẽ không phù hợp INDIANA
. Do đó, áp dụng cùng một nguyên tắc - '\b[A-Z]+\b'
sẽ tìm kiếm toàn bộ các từ có một hoặc nhiều chữ cái viết hoa.egrep '\b[A-Z]+\b' filename.sh
sẽ tìm kiếm các từ có một hoặc nhiều chữ cái in hoa trong tệp - filename.sh
.\b
- chính xác như một tìm kiếm toàn bộ từ.
[azA-Z0-9_]
. Kiểm tra hướng dẫnegrep(1)
, có lẽ là nhân đôi cho các biểu thức thông thường đang sử dụng.