awk và regex với {}


0

Tôi muốn in toàn bộ bản ghi nếu nó chứa từ và một số ký tự, là tùy chọn. Kịch bản:

/mount[ein]{0,2}/{
print $0}

Thật không may, nó không hoạt động. Không có "{" và "}", nó hoạt động. Tôi đã thử với "\" befor "{":

/mount[ein]\{0,2\}/{
    print $0}

Ví dụ khác. Đối với tệp:

mountx
mounte
mountee
mounteee

Awk:

awk '/mount[ein]{0,2}$/' file

Và kết quả:

//không có gì

Hệ thống: Debian 7.8 Linux ibm 3.2.0-4-amd64 # 1 SMP Debian 3.2.68-1 + deb7u1 x86_64 GNU / Linux


Hiển thị đầu vào và đầu ra mong muốn của bạn.
John1024

Đầu vào là một văn bản (một phần của cuốn sách). Tôi chỉ muốn biết tại sao regex không hoạt động. Là {} không làm việc trong awk.
diego9403

1
Điều gì khiến bạn tin rằng regex không hoạt động? Không cần nói đầu vào, đầu ra dự kiến ​​và đầu ra thực tế, thật khó để chúng ta đoán.
jlliagre

Câu trả lời:


0

Biểu thức chính quy của bạn hoạt động với cả awkGNU và tuân thủ POSIX awk.

Với thực tế là các ký tự e, inphải có mặt từ 0 đến 3 lần nhưng không có ràng buộc nào nữa, phần này có thể được loại bỏ khỏi mô hình như mountsau bởi bất cứ điều gì hoặc không có gì phù hợp. Hành động ( print $0) cũng là hành động mặc định không cần phải được chỉ định.

Lệnh của bạn sau đó có thể được đơn giản hóa thành:

awk '/mount/'

Nếu bạn muốn phạm vi được sử dụng, bạn cần chỉ định một cái gì đó sau nó, đây là một ví dụ:

$ cat input
foo
mountx
mounte
mountee
mounteee
$ /usr/xpg4/bin/awk '/mount[ein]{0,2}$/' input
mounte
mountee

Đó là trên Solaris nơi POSIX awkđang ở /usr/xpg4/bin.

Hành vi tương tự trên Mint dựa trên Debian 17.1:

$ awk -V | head -1      
GNU Awk 4.0.1
$ awk '/mount[ein]{1,2}$/' input     
mounte
mountee

Tuy nhiên, có vẻ như mawk, yêu cầu tuân thủ POSIX, không hỗ trợ biểu thức khoảng (dấu ngoặc).

$ mawk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
$ mawk '/mount[ein]{1,2}$/' input
$ 

Đây là một lỗi đã biết .


Tôi đã sao chép đầu vào và lệnh của bạn, nhưng trong Debian của tôi, nó không hoạt động. Nhưng không có "{}" awk hiển thị kết quả, vậy có lẽ có điều gì đó không ổn với hệ điều hành của tôi?
diego9403

Một lần nữa, vui lòng giải thích ý của bạn với "nó không hoạt động", tức là lệnh thực tế chạy, đầu vào của nó, đầu ra dự kiến ​​và đầu ra thực tế của nó.
jlliagre

Tôi xin lỗi. Đầu ra không phải là những gì tôi nghi ngờ. Tôi nghĩ đó là vì regex, vì tôi đã thử cái khác mà không có "{}". Hôm qua tôi đã kiểm tra tập lệnh tương tự trên hệ thống khác (Slackware) và nó hoạt động, vì vậy tôi nghĩ rằng có điều gì đó không ổn với Debian của tôi. Ngay cả tôi cũng sao chép tập lệnh của bạn và Debian không hiển thị gì cả,
diego9403

Vui lòng chỉnh sửa câu hỏi của bạn với các chi tiết được yêu cầu: Phiên bản awk nào bạn đang chạy trên Debian đó, bạn nhận được đầu ra nào với lệnh nào và đầu vào nào.
jlliagre

Một lý do cho lệnh không xuất bất cứ thứ gì có thể là các dòng đầu vào được kết thúc bằng CRLF (kiểu Windows) so với LF (kiểu Unix). Hãy thửawk '/mount[ein]{1,2}\r$/' input
jlliagre

2

Ví dụ tst.txt:

mountx
mounte
mountee
mounteee

tập lệnh awk (GNU Awk 3.1.7)

awk --re-interval '/mount[ein]{0,2}$/' tst.txt > tst1.txt

kết quả

mounte
mountee

người đàn ông

-W re-interval
--re-interval
          Enable the use of interval expressions in regular expression matching (see Regular Expressions, below).  Interval expressions were not traditionally available in the AWK
          language.  The POSIX standard added them, to make awk and egrep consistent with each other.  However, their use is likely to break old AWK programs, so  gawk  only  pro-
          vides them if they are requested with this option, or when --posix is specified.

0

Không chắc chắn về định dạng lệnh mount của bạn và câu hỏi được liệt kê dưới dạng câu hỏi "awk", không có awk trong bình luận của bạn.

Đây có phải là những gì bạn đang tìm kiếm?

"in tất cả các dòng có chứa 0" (hoặc bất kỳ chuỗi nào bạn đang tìm kiếm) từ một tệp - sử dụng lệnh

cat temp.txt | grep 0 | awk '{print $0}'

sẽ cho kết quả

0 9 8 7 6 5 4 3 2

5 4 3 2 1 0 9 8

temp.txt ở đâu

1 2 3 4 5 6 7

0 9 8 7 6 5 4 3 2

9 8 7 6 5 4

8 7 6 5 4 3

7 6 5 4 3

6 5 4 3

5 4 3 2 1 0 9 8

4

3

2


Kết quả là ổn, nhưng tôi phải viết nó hoàn toàn bằng kịch bản awk và tôi không biết tại sao "{}" không hoạt động. Bạn có biết tại sao regex của tôi không hoạt động không?
diego9403

Không phải không biết / mount [ein] là gì
WillW

"mount" <- đây là từ không đổi, nhưng các ký tự ein có thể xếp thành hàng, nhưng không phải và 3 ký tự (ein) có thể được lặp lại 0, một hoặc hai lần.
diego9403
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.