Tìm số dòng chứa mẫu bằng cách sử dụng dấu phân cách biểu thức chính


7

Như trong ví dụ, tôi đang cố lấy các số dòng có chứa mẫu. Mẫu của tôi chứa dấu gạch chéo vì vậy tôi muốn thêm dấu phân cách tùy chỉnh.

Điều này đơn giản hoạt động:

sed -n '/file/=' temp.txt

Sử dụng dấu phân cách cho chuỗi thay thế cũng hoạt động:

sed 's|file|gile|' temp.txt

nhưng khi tôi muốn thêm dấu phân cách vào ví dụ đầu tiên thì không:

sed -n '|file /etc|=' temp.txt

Tôi biết tôi có thể thoát dấu gạch chéo nhưng tôi muốn thêm dấu phân cách tùy chỉnh. Bất kỳ ý tưởng làm thế nào để sửa lệnh của tôi?


sed -n '\|file /etc|='
Stéphane Chazelas

Cảm ơn! Những gì tôi tìm thấy sau câu trả lời của bạn: \% regrec% (% có thể được thay thế bằng bất kỳ ký tự đơn nào khác.) Điều này cũng phù hợp với biểu thức chính quy chính quy, nhưng cho phép một người sử dụng một dấu phân cách khác so với /. Điều này đặc biệt hữu ích nếu bản thân regrec chứa rất nhiều dấu gạch chéo, vì nó tránh được sự thoát tẻ nhạt của mọi /. Nếu bản thân biểu thức chính quy bao gồm bất kỳ ký tự phân cách nào, mỗi ký tự phải được thoát bằng dấu gạch chéo ngược ().
jasiustasiu

Câu trả lời:


9

Stéphane đã cho bạn các sedgiải pháp:

sed -n  '\|file /etc|=' file 

Nếu bạn đang mở để sử dụng các công cụ khác, bạn cũng có thể làm

grep -n 'file /etc' file

Điều đó cũng sẽ tự in dòng, để lấy số dòng một mình:

grep -n 'file /etc' file | cut -d: -f 1

Hoặc, bạn có thể sử dụng perl:

perl -lne 'm|file /etc| && print $.' file 

Hoặc awk:

awk '$0 ~ "file /etc" {print NR}'

Sử dụng dấu chấm sẽ tìm thấy "vv" trước bất kỳ ký tự nào. Sử dụng một dấu gạch chéo để được cụ thể.
Tạm dừng cho đến khi có thông báo mới.

@DennisWilliamson Tôi không biết tại sao tôi lại sử dụng một dấu chấm trong một vài trong số đó. Phải là một vật phẩm từ các thử nghiệm của tôi. Cảm ơn, đã sửa.
terdon

4

Trong tất cả các địa chỉ ngữ cảnh, bạn phải thoát khỏi dấu phân cách mở , trừ khi bạn đang sử dụng mặc định /. Bất kỳ sự cố nào sau đây được thoát đều được coi là ký tự theo nghĩa đen, không phải là dấu phân cách kết thúc.

  • dấu phân cách mặc định:

    /start/,/end/{/pattern/d;}
    
  • dấu phân cách tùy chỉnh:

    \#start#,\#end#{\#pattern#d;}
    

Xem tài liệu POSIX :

Trong một địa chỉ ngữ cảnh, cấu trúc \ cREc trong đó c là bất kỳ ký tự nào ngoài dấu gạch chéo ngược hoặc ký tự dòng mới, giống hệt với / RE / Nếu ký tự được chỉ định bởi c xuất hiện sau dấu gạch chéo ngược, thì nó được coi là ký tự chữ đó không chấm dứt RE. Ví dụ: trong địa chỉ ngữ cảnh \ xabc \ xdefx, x thứ hai là viết tắt của chính nó, do đó biểu thức chính là abcxdef.

Mô tả tương tự trong sed mantrang GNU :

/regexp/
       Match lines matching the regular expression regexp.      
\cregexpc
       Match lines matching the regular expression regexp.  
       The c may be any character.

sed mantrang FreeBSD :

In a context address, any character other than a backslash (``\'')
or newline character may be used to delimit the regular expression.
The opening delimiter   needs to be preceded by a backslash unless it
is a slash.  For example, the   context address \xabcx is equivalent
to /abc/.  Also, putting a backslash character before   the delimiting
character within the regular expression causes the character to be
treated literally.  For example, in the context address \xabc\xdefx,
the RE delimiter is an ``x'' and the second ``x'' stands for itself,
so that the regular expression is ``abcxdef''.
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.