Cách sử dụng lệnh sed trên Linux

Tác giả sysadmin, T.Chín 05, 2023, 11:39:49 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách sử dụng lệnh sed trên Linux


Với lệnh sed, bạn có thể chỉnh sửa văn bản trong tệp và luồng trên Linux. Kiểm tra tất cả những thứ bạn có thể làm với nó.

  • Lệnh sed của Linux là một trình soạn thảo văn bản mạnh mẽ không có giao diện, được sử dụng để thao tác văn bản trong tệp và luồng.
  • Sed có thể chọn, thay thế, thêm, xóa và sửa đổi văn bản trong tệp và luồng, cung cấp hướng dẫn để nó thực hiện theo khi hoạt động.
  • Sed chủ yếu dựa vào các biểu thức chính quy để khớp mẫu và chọn văn bản, đồng thời việc làm quen với các biểu thức chính quy là điều quan trọng để sử dụng sed một cách hiệu quả.


Nghe có vẻ điên rồ nhưng sed lệnh Linux là một trình soạn thảo văn bản không có giao diện. Bạn có thể sử dụng nó từ dòng lệnh để thao tác văn bản trong tệp và luồng. Chúng tôi sẽ chỉ cho bạn cách khai thác sức mạnh của nó.

1. Sức mạnh của sed

Lệnh này sed hơi giống cờ vua: phải mất một giờ để học những điều cơ bản và cả đời để thành thạo chúng (hoặc ít nhất là thực hành rất nhiều). Chúng tôi sẽ chỉ cho bạn một số lựa chọn mở gambit trong mỗi loại sed chức năng chính.

sed là trình chỉnh sửa luồng hoạt động trên đầu vào theo đường ống hoặc tệp văn bản. Tuy nhiên, nó không có giao diện soạn thảo văn bản tương tác. Đúng hơn, bạn cung cấp hướng dẫn để nó thực hiện theo khi nó hoạt động thông qua văn bản. Tất cả điều này đều hoạt động trong Bash và các shell dòng lệnh khác.

Với sed bạn có thể làm tất cả những điều sau đây:

  • Chọn văn bản
  • Văn bản thay thế
  • Thêm dòng vào văn bản
  • Xóa dòng khỏi văn bản
  • Sửa đổi (hoặc bảo tồn) tệp gốc

Chúng tôi đã cấu trúc các ví dụ của mình để giới thiệu và minh họa các khái niệm chứ không phải để tạo ra các sed lệnh ngắn gọn nhất (và ít dễ tiếp cận nhất). Tuy nhiên, chức năng khớp mẫu và chọn văn bản phụ thuộc sed rất nhiều vào các biểu thức chính quy (regexes). Bạn sẽ cần làm quen với những điều này để tận dụng tối đa sed.

2. Một ví dụ đơn giản

Đầu tiên, chúng ta sẽ sử dụng echocách gửi một số văn bản sed qua một đường ống và sed thay thế một phần văn bản. Để làm như vậy, chúng tôi gõ như sau:

Mã nguồn [Chọn]
echo howtogonk | sed 's/gonk/geek/'
Lệnh echo gửi "howtogonk" vào sed, và quy tắc thay thế đơn giản của chúng tôi ("s" là viết tắt của thay thế) được áp dụng. sed tìm kiếm văn bản đầu vào để tìm sự xuất hiện của chuỗi đầu tiên và sẽ thay thế bất kỳ kết quả trùng khớp nào bằng chuỗi thứ hai.

Chuỗi "gonk" được thay thế bằng "geek" và chuỗi mới được in trong cửa sổ terminal.

Sự thay thế có lẽ là cách sử dụng phổ biến nhất của sed. Tuy nhiên, trước khi có thể đi sâu hơn vào tính năng thay thế, chúng ta cần biết cách chọn và khớp văn bản.

3. Chọn văn bản

Chúng ta sẽ cần một tệp văn bản cho các ví dụ của mình. Chúng ta sẽ sử dụng một bài có tuyển tập các câu từ bài thơ sử thi "The Rime of the Ancient Mariner" của Samuel Taylor Coleridge.

Chúng tôi gõ như sau để xem nó với less:

Mã nguồn [Chọn]
less coleridge.txt

Để chọn một số dòng từ tệp, chúng tôi cung cấp dòng bắt đầu và kết thúc của phạm vi mà chúng tôi muốn chọn. Một số duy nhất chọn một dòng đó.

Để trích xuất các dòng từ một đến bốn, chúng ta gõ lệnh này:

Mã nguồn [Chọn]
sed -n '1,4p' coleridge.txt
Lưu ý dấu phẩy giữa 1và 4. Có pnghĩa là "in các dòng khớp." Theo mặc định, sed in tất cả các dòng. Chúng tôi sẽ thấy tất cả văn bản trong tệp có dòng phù hợp được in hai lần. Để ngăn chặn điều này, chúng tôi sẽ sử dụng -n tùy chọn (im lặng) để chặn văn bản không khớp.

Chúng ta thay đổi số dòng để có thể chọn một câu khác, như minh họa bên dưới:

Mã nguồn [Chọn]
sed -n '6,9p' coleridge.txt

Chúng ta có thể sử dụng -e tùy chọn (biểu thức) để thực hiện nhiều lựa chọn. Với hai cách diễn đạt, chúng ta có thể chọn hai câu thơ như sau:

Mã nguồn [Chọn]
sed -n -e '1,4p' -e '31,34p' coleridge.txt
Nếu giảm số đầu tiên trong biểu thức thứ hai, chúng ta có thể chèn khoảng trống giữa hai câu thơ. Chúng ta gõ như sau:

Mã nguồn [Chọn]
sed -n -e '1,4p' -e '30,34p' coleridge.txt

Chúng ta cũng có thể chọn dòng bắt đầu và yêu cầu sed duyệt qua tệp và in các dòng thay thế, mỗi dòng thứ năm hoặc bỏ qua bất kỳ số dòng nào. Lệnh này tương tự như lệnh chúng tôi đã sử dụng ở trên để chọn một phạm vi. Tuy nhiên, lần này chúng ta sẽ sử dụng dấu ngã (~) thay vì dấu phẩy để phân tách các số.

Số đầu tiên chỉ vạch xuất phát. Số thứ hai cho biết sed chúng ta muốn xem dòng nào sau vạch xuất phát. Số 2 có nghĩa là mỗi dòng thứ hai, 3 có nghĩa là mỗi dòng thứ ba, v.v.

Chúng ta gõ như sau:

Mã nguồn [Chọn]
sed -n '1~2p' coleridge.txt

Không phải lúc nào bạn cũng biết văn bản bạn đang tìm kiếm nằm ở đâu trong tệp, điều đó có nghĩa là số dòng không phải lúc nào cũng giúp ích nhiều. Tuy nhiên, bạn cũng có thể sử dụng sed để chọn các dòng có chứa mẫu văn bản phù hợp. Ví dụ: hãy trích xuất tất cả các dòng bắt đầu bằng "And."

Dấu mũ (^) đại diện cho sự bắt đầu của dòng. Chúng tôi sẽ đặt cụm từ tìm kiếm của mình trong dấu gạch chéo lên ( /). Chúng tôi cũng bao gồm một khoảng trắng sau "Và" để những từ như "Android" sẽ không được đưa vào kết quả.

Đọc sed kịch bản lúc đầu có thể hơi khó khăn. Nó /pcó nghĩa là "in", giống như trong các lệnh chúng ta đã sử dụng ở trên. Tuy nhiên, trong lệnh sau đây, có dấu gạch chéo phía trước lệnh đó:

Mã nguồn [Chọn]
sed -n '/^And /p' coleridge.txt

Ba dòng bắt đầu bằng "Và " được trích xuất từ tệp và hiển thị cho chúng tôi.

4. Thay thế

Trong ví dụ đầu tiên, chúng tôi đã giới thiệu cho bạn định dạng cơ bản sau để sed thay thế:

Mã nguồn [Chọn]
echo howtogonk | sed 's/gonk/geek/'
Việc cho biết sed đây là một sự thay thế. Chuỗi đầu tiên là mẫu tìm kiếm và chuỗi thứ hai là văn bản mà chúng tôi muốn thay thế văn bản phù hợp đó. Tất nhiên, cũng như mọi thứ trên Linux, điều ác nằm ở các chi tiết.

Chúng tôi gõ nội dung sau để thay đổi tất cả các lần xuất hiện của "ngày" thành "tuần" và giúp người thủy thủ và chim hải âu có thêm thời gian để gắn kết:

Mã nguồn [Chọn]
sed -n 's/day/week/p' coleridge.txt
Ở dòng đầu tiên, chỉ có lần xuất hiện thứ hai của "ngày" được thay đổi. Điều này là do sed dừng sau trận đấu đầu tiên trên mỗi dòng. Chúng ta phải thêm "g" vào cuối biểu thức, như hiển thị bên dưới, để thực hiện tìm kiếm tổng thể sao cho tất cả kết quả khớp trong mỗi dòng đều được xử lý:

Mã nguồn [Chọn]
sed -n 's/day/week/gp' coleridge.txt
Điều này phù hợp với ba trong số bốn ở dòng đầu tiên. Vì từ đầu tiên là "Ngày" và sed phân biệt chữ hoa chữ thường nên nó không coi trường hợp đó giống với "ngày".

Chúng tôi gõ nội dung sau, thêm vào lệnh ở cuối biểu thức để biểu thị phân biệt chữ hoa chữ thường:

Mã nguồn [Chọn]
sed -n 's/day/week/gip' coleridge.txt
Cách này hiệu quả nhưng không phải lúc nào bạn cũng muốn bật tính năng không phân biệt chữ hoa chữ thường cho mọi thứ. Trong những trường hợp đó, bạn có thể sử dụng nhóm biểu thức chính quy để thêm tính năng không phân biệt chữ hoa chữ thường theo mẫu cụ thể.

Ví dụ: nếu chúng ta đặt các ký tự trong dấu ngoặc vuông ( []), chúng sẽ được hiểu là "bất kỳ ký tự nào trong danh sách ký tự này".

Chúng tôi nhập thông tin sau và bao gồm "D" và "d" trong nhóm để đảm bảo nó khớp với cả "Ngày" và "ngày":

Mã nguồn [Chọn]
sed -n 's/[Dd]ay/week/gp' coleridge.txt

Chúng tôi cũng có thể hạn chế việc thay thế các phần của tệp. Giả sử tệp của chúng tôi có khoảng cách kỳ lạ trong câu đầu tiên. Chúng ta có thể sử dụng lệnh quen thuộc sau để xem câu đầu tiên:

Mã nguồn [Chọn]
sed -n '1,4p' coleridge.txt
Chúng ta sẽ tìm kiếm hai khoảng trắng và thay thế chúng bằng một khoảng trống. Chúng tôi sẽ thực hiện việc này trên toàn cầu để hành động được lặp lại trên toàn bộ dòng. Để rõ ràng, mẫu tìm kiếm là dấu cách, dấu hoa thị dấu cách ( *) và chuỗi thay thế là một khoảng trắng. Việc 1,4hạn chế thay thế trong bốn dòng đầu tiên của tệp.

Chúng tôi kết hợp tất cả những thứ đó lại với nhau trong lệnh sau:

Mã nguồn [Chọn]
sed -n '1,4 s/ */ /gp' coleridge.txt
Điều này hoạt động tốt đẹp! Mẫu tìm kiếm là điều quan trọng ở đây. Dấu hoa thị ( *) biểu thị số 0 hoặc nhiều ký tự trước đó, là khoảng trắng. Do đó, mẫu tìm kiếm đang tìm kiếm các chuỗi có một khoảng trắng trở lên.

Nếu chúng tôi thay thế một khoảng trắng bằng bất kỳ chuỗi nhiều khoảng trắng nào, chúng tôi sẽ đưa tệp về khoảng cách thông thường, với một khoảng trắng duy nhất giữa mỗi từ. Điều này cũng sẽ thay thế một khoảng trắng bằng một khoảng trắng trong một số trường hợp, nhưng điều này sẽ không ảnh hưởng bất lợi gì cả---chúng ta vẫn sẽ nhận được kết quả mong muốn.

Nếu chúng tôi gõ nội dung sau và giảm mẫu tìm kiếm xuống một khoảng trắng, bạn sẽ thấy ngay lý do tại sao chúng tôi phải bao gồm hai khoảng trắng:

Mã nguồn [Chọn]
sed -n '1,4 s/ */ /gp' coleridge.txt

Vì dấu hoa thị khớp với 0 hoặc nhiều ký tự trước đó nên nó coi mỗi ký tự không phải là khoảng trắng là "khoảng trắng bằng 0" và áp dụng thay thế cho ký tự đó.

Tuy nhiên, nếu chúng ta bao gồm hai khoảng trắng trong mẫu tìm kiếm thì sed phải tìm ít nhất một ký tự khoảng trắng trước khi áp dụng thay thế. Điều này đảm bảo các ký tự không phải khoảng trắng sẽ không bị ảnh hưởng.

Chúng tôi gõ nội dung sau, sử dụng -e(biểu thức) mà chúng tôi đã sử dụng trước đó, cho phép chúng tôi thực hiện đồng thời hai hoặc nhiều thay thế:

Mã nguồn [Chọn]
sed -n -e 's/motion/flutter/gip' -e 's/ocean/gutter/gip' coleridge.txt
Chúng ta có thể đạt được kết quả tương tự nếu sử dụng dấu chấm phẩy ( ;) để phân tách hai biểu thức, như sau:

Mã nguồn [Chọn]
sed -n 's/motion/flutter/gip;s/ocean/gutter/gip' coleridge.txt

Khi chúng ta hoán đổi "ngày" thành "tuần" trong lệnh sau, phiên bản "ngày" trong biểu thức "à một ngày" cũng được hoán đổi:

Mã nguồn [Chọn]
sed -n 's/[Dd]ay/week/gp' coleridge.txt
Để ngăn chặn điều này, chúng tôi chỉ có thể thử thay thế trên các dòng khớp với mẫu khác. Nếu chúng tôi sửa đổi lệnh để có mẫu tìm kiếm ngay từ đầu, chúng tôi sẽ chỉ xem xét thao tác trên các dòng khớp với mẫu đó.

Chúng tôi gõ nội dung sau để tạo mẫu phù hợp của chúng tôi thành từ "sau":

Mã nguồn [Chọn]
sed -n '/after/ s/[Dd]ay/week/gp' coleridge.txt
Điều đó mang lại cho chúng tôi phản hồi mà chúng tôi muốn.


5. Thay thế phức tạp hơn

Hãy để Coleridge nghỉ ngơi và sử dụng nó sed để trích xuất tên từ etc/passwdtệp.

Có nhiều cách ngắn hơn để làm điều này (sẽ nói thêm về điều đó sau), nhưng chúng ta sẽ sử dụng cách dài hơn ở đây để chứng minh một khái niệm khác. Mỗi mục phù hợp trong mẫu tìm kiếm (được gọi là biểu thức con) có thể được đánh số (tối đa là chín mục). Sau đó, bạn có thể sử dụng những con số này trong sed các lệnh của mình để tham chiếu các biểu thức con cụ thể.

Bạn phải đặt biểu thức con trong dấu ngoặc đơn [ ()] để nó hoạt động. Trước các dấu ngoặc đơn cũng phải có dấu gạch chéo ngược ( \) để tránh bị coi là ký tự bình thường.

Để làm điều này, bạn sẽ gõ như sau:

Mã nguồn [Chọn]
sed 's/\([^:]*\).*/\1/' /etc/passwd
Hãy chia nhỏ điều này:

  • sed 's/: Lệnh sed và phần đầu của biểu thức thay thế.
  • \(: Dấu ngoặc đơn mở [ (] bao quanh biểu thức con, trước dấu gạch chéo ngược ( \).
  • [^:]*: Biểu thức con đầu tiên của cụm từ tìm kiếm chứa một nhóm trong dấu ngoặc vuông. Dấu mũ ( ^) có nghĩa là "không" khi được sử dụng trong một nhóm. Một nhóm có nghĩa là bất kỳ ký tự nào không phải là dấu hai chấm ( :) sẽ được chấp nhận làm đối sánh.
  • \): Dấu ngoặc đơn đóng [ )] có dấu gạch chéo ngược trước ( \).
  • .*: Biểu thức con tìm kiếm thứ hai này có nghĩa là "bất kỳ ký tự nào và bất kỳ số nào trong số chúng."
  • /\1: Phần thay thế của biểu thức chứa 1dấu gạch chéo ngược ( \). Điều này thể hiện văn bản khớp với biểu thức con đầu tiên.
  • /': Dấu gạch chéo chuyển tiếp ( /) và dấu ngoặc đơn ( ') kết thúc sed lệnh.

Điều này có nghĩa là chúng ta sẽ tìm kiếm bất kỳ chuỗi ký tự nào không chứa dấu hai chấm (:), đây sẽ là trường hợp đầu tiên của văn bản trùng khớp. Sau đó, chúng tôi đang tìm kiếm bất kỳ thứ gì khác trên dòng đó, đây sẽ là phiên bản thứ hai của văn bản trùng khớp. Chúng ta sẽ thay thế toàn bộ dòng bằng văn bản khớp với biểu thức con đầu tiên.

Mỗi dòng trong /etc/passwdtệp bắt đầu bằng tên người dùng kết thúc bằng dấu hai chấm. Chúng tôi khớp mọi thứ với dấu hai chấm đầu tiên và sau đó thay thế giá trị đó cho toàn bộ dòng. Vì vậy, chúng tôi đã cô lập tên người dùng.


Tiếp theo, chúng ta sẽ đặt biểu thức con thứ hai trong dấu ngoặc đơn [ ()] để có thể tham chiếu nó theo số. Chúng tôi cũng sẽ thay thế \1bằng \2. Lệnh của chúng ta bây giờ sẽ thay thế toàn bộ dòng bằng mọi thứ từ dấu hai chấm đầu tiên ( :) đến cuối dòng.

Chúng ta gõ như sau:

Mã nguồn [Chọn]
sed 's/\([^:]*\)\(.*\)/\2/' /etc/passwd
Những thay đổi nhỏ đó sẽ đảo ngược ý nghĩa của lệnh và chúng tôi nhận được mọi thứ ngoại trừ tên người dùng.


Bây giờ chúng ta hãy xem cách nhanh chóng và dễ dàng để làm điều này.

Cụm từ tìm kiếm của chúng tôi là từ dấu hai chấm đầu tiên ( :) đến cuối dòng. Vì biểu thức thay thế của chúng tôi trống ( //), nên chúng tôi sẽ không thay thế văn bản phù hợp bằng bất kỳ thứ gì.

Vì vậy, chúng tôi gõ nội dung sau, cắt bỏ mọi thứ từ dấu hai chấm đầu tiên ( :) đến cuối dòng, chỉ để lại tên người dùng:

Mã nguồn [Chọn]
sed 's/:.*//" /etc/passwd
Hãy xem một ví dụ trong đó chúng ta tham chiếu kết quả khớp thứ nhất và thứ hai trong cùng một lệnh.

Chúng ta có một tệp có dấu phẩy (,) ngăn cách họ và tên. Chúng tôi muốn liệt kê họ là "họ, tên". Chúng ta có thể sử dụng cat, như hiển thị bên dưới, để xem nội dung trong tệp:

Mã nguồn [Chọn]
cat geeks.txt
Giống như nhiều sed lệnh khác, lệnh tiếp theo này ban đầu có vẻ khó hiểu:

Mã nguồn [Chọn]
sed 's/^\(.*\),\(.*\)$/\2,\1 /g' geeks.txt

Đây là lệnh thay thế giống như những lệnh khác mà chúng tôi đã sử dụng và mẫu tìm kiếm khá dễ dàng. Chúng tôi sẽ chia nhỏ nó dưới đây:

  • sed 's/: Lệnh thay thế thông thường.
  • ^: Vì dấu mũ không nằm trong nhóm ( []), nên nó có nghĩa là "Nơi bắt đầu của dòng".
  • \(.*\),: Biểu thức con đầu tiên là bất kỳ số lượng ký tự nào. Nó được đặt trong dấu ngoặc đơn [ ()], trước mỗi dấu ngoặc đơn là dấu gạch chéo ngược ( \) để chúng ta có thể tham chiếu nó theo số. Toàn bộ mẫu tìm kiếm của chúng tôi cho đến nay được dịch là tìm kiếm từ đầu dòng đến dấu phẩy đầu tiên (,) cho bất kỳ số lượng ký tự nào.
  • \(.*\): Biểu thức con tiếp theo là (một lần nữa) bất kỳ số nào của ký tự bất kỳ. Nó cũng được đặt trong dấu ngoặc đơn [ ()], cả hai đều đứng trước dấu gạch chéo ngược ( \) để chúng ta có thể tham chiếu văn bản phù hợp theo số.
  • $/: Ký hiệu đô la ( $) đại diện cho phần cuối của dòng và sẽ cho phép tìm kiếm của chúng tôi tiếp tục đến cuối dòng. Chúng tôi đã sử dụng điều này chỉ để giới thiệu ký hiệu đô la. Chúng tôi không thực sự cần nó ở đây vì dấu hoa thị ( *) sẽ ở cuối dòng trong trường hợp này. Dấu gạch chéo lên ( /) hoàn thành phần mẫu tìm kiếm.
  • \2,\1 /g': Vì chúng ta đặt hai biểu thức con trong dấu ngoặc đơn nên chúng ta có thể gọi cả hai biểu thức này bằng số của chúng. Vì muốn đảo ngược thứ tự nên chúng ta gõ chúng dưới dạng second-match,first-match. Trước các số phải có dấu gạch chéo ngược ( \).
  • /g: Điều này cho phép lệnh của chúng tôi hoạt động toàn cầu trên mỗi dòng.
  • geeks.txt: Tệp chúng tôi đang làm việc.

Bạn cũng có thể sử dụng lệnh Cắt ( c) để thay thế toàn bộ dòng phù hợp với mẫu tìm kiếm của bạn. Chúng tôi gõ nội dung sau để tìm kiếm một dòng có từ "cổ" trong đó và thay thế nó bằng một chuỗi văn bản mới:

Mã nguồn [Chọn]
sed '/neck/c Around my wrist was strung' coleridge.txt
Dòng mới của chúng tôi bây giờ xuất hiện ở cuối phần trích xuất của chúng tôi.


6. Chèn dòng và văn bản

Chúng tôi cũng có thể chèn dòng và văn bản mới vào tệp của mình. Để chèn các dòng mới sau bất kỳ dòng nào phù hợp, chúng ta sẽ sử dụng lệnh Nối ( a).

Đây là tập tin chúng ta sẽ làm việc với:

Mã nguồn [Chọn]
cat geeks.txt

Chúng tôi đã đánh số các dòng để làm cho việc này dễ theo dõi hơn một chút.

Chúng tôi gõ nội dung sau để tìm kiếm các dòng có chứa từ "Anh ấy" và chèn một dòng mới bên dưới chúng:

Mã nguồn [Chọn]
sed '/He/a --> Inserted!' geeks.txt

Chúng tôi gõ nội dung sau và bao gồm Lệnh Chèn ( i) để chèn dòng mới phía trên những dòng có chứa văn bản phù hợp:

Mã nguồn [Chọn]
sed '/He/i --> Inserted!' geeks.txt

Chúng ta có thể sử dụng ký hiệu ( &), đại diện cho văn bản trùng khớp ban đầu, để thêm văn bản mới vào dòng khớp. \1, \2, v.v., biểu diễn các biểu thức con phù hợp.

Để thêm văn bản vào đầu dòng, chúng tôi sẽ sử dụng lệnh thay thế khớp với mọi thứ trên dòng, kết hợp với mệnh đề thay thế kết hợp văn bản mới của chúng tôi với dòng ban đầu.

Để thực hiện tất cả điều này, chúng tôi gõ như sau:

Mã nguồn [Chọn]
sed 's/.*/--> Inserted &/' geeks.txt

Chúng tôi gõ nội dung sau, bao gồm cả G lệnh, lệnh này sẽ thêm một dòng trống giữa mỗi dòng:

Mã nguồn [Chọn]
sed 'G' geeks.txt

Nếu bạn muốn thêm hai hoặc nhiều dòng trống, bạn có thể sử dụng,, v.v.

7. Xóa dòng

Lệnh Xóa (d) xóa các dòng khớp với mẫu tìm kiếm hoặc những dòng được chỉ định bằng số dòng hoặc phạm vi.

Ví dụ: để xóa dòng thứ ba, chúng ta sẽ gõ như sau:

Mã nguồn [Chọn]
sed '3d' geeks.txt
Để xóa phạm vi dòng từ 4 đến 5, chúng ta gõ như sau:

Mã nguồn [Chọn]
sed '4,5d' geeks.txt
Để xóa các dòng ngoài một phạm vi, chúng ta sử dụng dấu chấm than (!), như hình dưới đây:

Mã nguồn [Chọn]
sed '6,7!d' geeks.txt

8. Lưu thay đổi của bạn

Cho đến nay, tất cả kết quả của chúng tôi đã được in ra cửa sổ terminal, nhưng chúng tôi vẫn chưa lưu chúng ở bất cứ đâu. Để biến những thay đổi này thành vĩnh viễn, bạn có thể ghi các thay đổi của mình vào tệp gốc hoặc chuyển hướng chúng sang tệp mới.

Việc ghi đè tập tin gốc của bạn cần phải thận trọng. Nếu sed lệnh của bạn sai, bạn có thể thực hiện một số thay đổi đối với tệp gốc mà khó hoàn tác.

Để yên tâm hơn, sed có thể tạo bản sao lưu của file gốc trước khi thực thi lệnh của mình.

Bạn có thể sử dụng tùy chọn Tại chỗ ( -i) để yêu cầu sed ghi các thay đổi vào tệp gốc, nhưng nếu bạn thêm phần mở rộng tệp vào đó, sed tệp gốc sẽ sao lưu sang tệp mới. Nó sẽ có cùng tên với tệp gốc nhưng có phần mở rộng tệp mới.

Để chứng minh, chúng tôi sẽ tìm kiếm bất kỳ dòng nào có chứa từ "Anh ấy" và xóa chúng. Chúng tôi cũng sẽ sao lưu tệp gốc của mình sang tệp mới bằng tiện ích mở rộng BAK.

Để thực hiện tất cả điều này, chúng tôi gõ như sau:

Mã nguồn [Chọn]
sed -i'.bak' '/^.*He.*$/d' geeks.txt
Chúng tôi gõ thông tin sau để đảm bảo tệp sao lưu của chúng tôi không thay đổi:

Mã nguồn [Chọn]
cat geeks.txt.bak

Chúng ta cũng có thể nhập nội dung sau để chuyển hướng đầu ra sang một tệp mới và đạt được kết quả tương tự:

Mã nguồn [Chọn]
sed -i'.bak' '/^.*He.*$/d' geeks.txt > new_geeks.txt
Chúng tôi sử dụng catđể xác nhận những thay đổi đã được ghi vào tệp mới, như hiển thị bên dưới:

Mã nguồn [Chọn]
cat new_geeks.txt

9. Có sed tất cả điều đó

Như bạn có thể đã nhận thấy, ngay cả phần tóm tắt nhanh này sed cũng khá dài. Có rất nhiều thứ trong lệnh này và thậm chí bạn còn có thể làm được nhiều việc hơn nữa với nó.

Tuy nhiên, hy vọng rằng những khái niệm cơ bản này đã cung cấp nền tảng vững chắc để bạn có thể xây dựng khi tiếp tục tìm hiểu thêm.