Sed и awk — Виктор Ашик
Mục lục:
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 địnhsed
ghi đầu ra của nó vào đầu ra tiêu chuẩn. Tùy chọn này nói vớised
để 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ủaSEARCH_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
và
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
Đệ 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.
Các chip RFID, được sử dụng trong nhiều ứng dụng đang phát triển trên toàn thế giới, lưu trữ một lượng nhỏ thông tin mà một thiết bị gần đó có thể đọc được. Trong số những thứ khác, các chip này có thể được sử dụng để lưu trữ dữ liệu khách hàng trên thẻ tín dụng hoặc cho phép những người có thẩm quyền mở cửa văn phòng bị khoá hoặc cửa xe trong hệ thống nhập cảnh "chìa khóa".
Dự luật California sẽ đưa ra ngoại lệ cho các tình huống khẩn cấp nhất định, như cho phép nhân viên chăm sóc sức khoẻ quét thẻ chăm sóc sức khoẻ cho phép sử dụng RFID của một người nào đó để giúp đỡ người đó. Dự luật này được đưa ra lần đầu tiên bởi Nghị sĩ California Joe Simitian vào năm 2006, và phiên bản cuối cùng đã được ký kết vào ngày thứ Tư. Nó đã được ủng hộ bởi nhiều nhóm khác nhau, từ Hiệp hội Công dân Hoa Kỳ cho chủ sở hữu súng của California.
Các ứng dụng mới cho phép người dùng iPhone truy vấn Google bên ngoài điện thoại được xây dựng trong trình duyệt Safari và cũng có thể tìm kiếm thông qua danh bạ của họ bằng cách sử dụng cảm biến gia tốc Báo New York Times. Ứng dụng của Google có thể cho biết khi bạn đang nâng điện thoại lên khuôn mặt và tự động kích hoạt phần mềm nhận dạng giọng nói sẽ xử lý giọng nói của bạn và gửi nó dưới dạng truy vấn tìm kiếm đến Google.
[ĐọC thêm: Điện thoại Android tốt nhất cho mỗi ngân sách . ]
Tôi đã có thể nghe thấy những người bất đồng chính kiến gọi tôi là thằng ngốc cho câu cuối cùng đó. Họ sẽ chỉ ra cách các ổ đĩa 1TB có thể có dưới 100 đô la và cách họ có thể mua dung lượng lưu trữ 10TB với giá của một ổ SSD 160 GB. Khi mọi người đưa ra những lý lẽ này, tôi không thể không biết liệu họ đã từng sử dụng SSD chưa. Các ổ SSD Intel và OCZ được đánh giá cao với dung lượng từ 60GB đến 250GB có thể có giá từ 230 đến 700 USD. Đối với ngân sách thực sự có ý thức và không gian hiệu quả,
Ổ đĩA tôi đang sử dụng là ổ cứng Intel X25-M 80GB có giá 260 đô la. Nghe có vẻ đắt hơn so với lưu trữ đĩa quay truyền thống; tuy nhiên bạn không mua dung lượng lưu trữ, bạn đang mua hiệu suất. Sau khi thay thế HD trên Dell Latitude D630 của tôi, thời gian khởi động sau BIOS giảm từ 29 giây xuống chỉ còn 13 giây và tắt máy sau 5 giây. Ứng dụng tải nhanh ấn tượng và toàn bộ hệ thống dường như có thể chụp nhanh.