Làm thế nào để tìm kiếm và thay thế nhiều kim bằng một từ thông qua một biểu thức?


8

Giả sử bạn có một tệp văn bản:

foo fnord bar
bizz foo poit

Và bây giờ tôi muốn thay thế cả "foo" và "bar" thành "narf".

Tôi biết tôi có thể sử dụng:

 sed -e 's/foo/narf/g' -e 's/bar/narf/g' fileName

Tuy nhiên, tôi muốn làm việc với toán tử OR cho biết biểu thức chính quy khớp với cả hai kim thông qua một biểu thức.

Đánh một số hướng dẫn Tôi cho rằng đường ống phải phù hợp với nhu cầu của tôi nhưng tôi đã thử

sed -e 's/foo|bar/narf/g' -i fileName

và nó không hoạt động và nó thậm chí không gây ra lỗi.

Tôi làm gì sai ở đây?

Câu trả lời:


10

Sử dụng -rtùy chọn cho cú pháp regrec mở rộng:

sed -r -e 's/foo|bar/narf/g'

Nếu không thì thoát khỏi sự phân biệt như \|:

sed -e 's/foo\|bar/narf/g'

6

Có nhiều biến thể về cú pháp biểu thức chính quy . Các công cụ đầu tiên trong thế giới unix có biểu thức chính quy không có đầy đủ khả năng của biểu thức chính quy, chỉ có các bộ ký tự ( […].), lặp lại ( *) và neo dòng ( ^$). Biểu thức chính quy cơ bản chỉ có các toán tử này. Sed là một công cụ trường học cũ và sử dụng các biểu thức cơ bản.

Nhiều triển khai sed có phần mở rộng cho kết hợp regrec đầy đủ. Bởi vì ký tự |là viết tắt của chính nó, bạn cần sử dụng \|để xen kẽ, và tương tự \(\)để nhóm. Lưu ý rằng tiêu chuẩn POSIX không bắt buộc \|được hỗ trợ trong các biểu thức chính quy cơ bản và một số hệ thống (ví dụ OpenBSD ) không có tiêu chuẩn này.

Một số phiên bản của sed có tùy chọn để chuyển sang các biểu thức chính quy mở rộng , trong đó (…)được sử dụng để nhóm và |thay thế. Với GNU sed (tức là theo Linux hoặc Cygwin) hoặc Busybox , hãy vượt qua -rtùy chọn này. Trên FreeBSD hoặc OSX , vượt qua -Etùy chọn.

Nếu sed của bạn không có sự thay thế, bạn có thể gọi awkthay thế. Nó được ủy quyền bởi POSIX , nhưng hơi dài dòng cho nhiệm vụ này và nó không hỗ trợ các phản hồi.

awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new

Nhân tiện, chỉ có GNU và Busybox sed hỗ trợ thay thế tập tin. Awk và các phiên bản khác của sed không. Xem Tôi có thể thực hiện `cut` thay đổi một tập tin tại chỗ không?

Nếu bạn có Perl, nó thường tiện dụng theo kiểu một công cụ duy nhất để xử lý văn bản một lớp. Hầu hết những gì dễ dàng trong sed, awk và phần còn lại không khó hơn nhiều ở Perl, và bạn có thể thoát khỏi việc học một công cụ (nếu phức tạp).

perl -i -pe 's/foo|bar/narf/g' fileName

0

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -sc '%s/\vPA|QU/RO/g|x' file
  1. % chọn tất cả các dòng

  2. s thay thế

  3. \v bật ma thuật

  4. g thay thế toàn cầu

  5. x lưu và đóng

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.