Android

Cách sử dụng sed để tìm và thay thế chuỗi trong tệp

Sed и awk — Виктор Ашик

Sed и awk — Виктор Ашик

Mục lục:

Anonim

Rất thường xuyên khi làm việc với các tệp văn bản, bạn sẽ cần tìm và thay thế các chuỗi văn bản trong một hoặc nhiều tệp.

sed là một seam ed itor. Nó có thể thực hiện thao tác văn bản cơ bản trên các tệp và luồng đầu vào như đường ống. Với sed bạn có thể tìm kiếm, tìm và thay thế, chèn và xóa các từ và dòng. Nó hỗ trợ các biểu thức chính quy cơ bản và mở rộng cho phép bạn khớp các mẫu phức tạp.

, chúng ta sẽ nói về cách tìm và thay thế chuỗi bằng sed . Chúng tôi cũng sẽ chỉ cho bạn cách thực hiện tìm kiếm đệ quy và thay thế.

Tìm và thay thế chuỗi bằng sed

Có một số phiên bản của sed , với một số khác biệt về chức năng giữa chúng. macOS sử dụng phiên bản BSD và hầu hết các bản phân phối Linux đi kèm với GNU sed được cài đặt sẵn theo mặc định. Chúng tôi sẽ sử dụng phiên bản GNU.

Hình thức chung của tìm kiếm và thay thế văn bản bằng sed có dạng sau:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Theo mặc định sed ghi đầu ra của nó vào đầu ra tiêu chuẩn. Tùy chọn này nói với sed để chỉnh sửa các tập tin tại chỗ. Nếu một phần mở rộng được cung cấp (ex -i.bak), bản sao lưu của tệp gốc sẽ được tạo. s - Lệnh thay thế, có lẽ là lệnh được sử dụng nhiều nhất trong sed. / / / - Ký tự phân cách. Nó có thể là bất kỳ ký tự nào nhưng thông thường ký tự gạch chéo ( / ) được sử dụng. SEARCH_REGEX - Chuỗi bình thường hoặc biểu thức chính quy để tìm kiếm. REPLACEMENT - Chuỗi thay thế. g - Cờ thay thế toàn cầu. Theo mặc định, sed đọc từng dòng tệp và chỉ thay đổi lần xuất hiện đầu tiên của SEARCH_REGEX trên một dòng. Khi cờ thay thế được cung cấp, tất cả các lần xuất hiện sẽ được thay thế. INPUTFILE - Tên của tệp mà bạn muốn chạy lệnh.

Đó là một cách thực hành tốt để đặt dấu ngoặc kép xung quanh đối số để các ký tự meta shell sẽ không mở rộng.

Chúng ta hãy xem các ví dụ về cách sử dụng lệnh sed để tìm kiếm và thay thế văn bản trong các tệp bằng một số tùy chọn và cờ được sử dụng phổ biến nhất.

Đối với mục đích trình diễn, chúng tôi sẽ sử dụng tệp sau:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Với cờ thay thế toàn cầu sed thay thế tất cả các lần xuất hiện của mẫu tìm kiếm:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Như bạn có thể nhận thấy, trong ví dụ trước, chuỗi con foo bên trong chuỗi foobar cũng được thay thế. Nếu đây không phải là hành vi mong muốn, hãy sử dụng biểu thức ràng buộc từ ( \b ) ở cả hai đầu của chuỗi tìm kiếm. Điều này đảm bảo các từ một phần không khớp.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Để làm cho trường hợp khớp mẫu không nhạy cảm, hãy sử dụng cờ I Trong ví dụ dưới đây, chúng tôi đang sử dụng cả cờ g I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

Tùy chọn dễ đọc và dễ đọc hơn nhiều là sử dụng một ký tự phân cách khác. Hầu hết mọi người sử dụng thanh dọc ( | ) hoặc dấu hai chấm (:) nhưng bạn có thể sử dụng bất kỳ ký tự nào khác:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Bạn cũng có thể sử dụng các biểu thức thông thường. Ví dụ: để tìm kiếm tất cả các số có 3 chữ số và thay thế chúng bằng number chuỗi bạn sẽ sử dụng:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Một tính năng hữu ích khác của sed là bạn có thể sử dụng ký tự dấu & tương ứng với mẫu phù hợp. Các nhân vật có thể được sử dụng nhiều lần.

Ví dụ: nếu bạn muốn thêm dấu ngoặc nhọn {} xung quanh mỗi số có 3 chữ số, hãy nhập:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Cuối cùng nhưng không kém phần quan trọng, luôn luôn là một ý tưởng tốt để tạo bản sao lưu khi chỉnh sửa tệp bằng sed . Để làm điều đó chỉ cần cung cấp một phần mở rộng cho tùy chọn -i . Ví dụ: để chỉnh sửa file.txt và lưu tệp gốc dưới dạng file.txt.bak bạn sẽ sử dụng:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Đệ quy Tìm và Thay thế

Đôi khi bạn muốn đệ quy tìm kiếm các thư mục cho các tệp chứa một chuỗi và thay thế chuỗi trong tất cả các tệp. Điều này có thể được thực hiện bằng cách sử dụng các lệnh như find hoặc grep để tìm đệ quy các tệp trong thư mục và đặt tên tệp vào sed .

Lệnh sau sẽ tìm kiếm đệ quy các tệp trong thư mục làm việc hiện tại và chuyển tên tệp cho sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Để tránh các vấn đề với các tệp chứa không gian trong tên của chúng, hãy sử dụng tùy chọn -print0 để find in tên tệp, theo sau là ký tự null và chuyển đầu ra sang sed bằng xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Để loại trừ một thư mục sử dụng tùy chọn -not -path . Ví dụ: nếu bạn đang thay thế một chuỗi trong repo git cục bộ của mình để loại trừ tất cả các tệp bắt đầu bằng dấu chấm ( . ), Hãy sử dụng:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Một tùy chọn khác là sử dụng grep để tìm đệ quy tất cả các tệp có chứa mẫu tìm kiếm và sau đó chuyển tên tệp thành sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Phần kết luận

Mặc dù có vẻ phức tạp và phức tạp, ban đầu, việc tìm kiếm và thay thế văn bản trong các tệp bằng sed rất đơn giản.

Để tìm hiểu thêm về các lệnh sed , tùy chọn và cờ, hãy truy cập hướng dẫn sử dụng GNU sed và hướng dẫn sử dụng sed của Grymoire. Nếu bạn có bất kỳ câu hỏi hoặc phản hồi, hãy để lại nhận xét.

thiết bị đầu cuối sed