Cách xóa các dòng cụ thể khỏi tệp bằng sed

Trong những trường hợp nhất định, chúng tôi cần xóa một dòng cụ thể khỏi một hoặc một số tệp, ví dụ, tôi đã xảy ra với tôi rằng tôi đã có toàn bộ danh sách các tệp và tôi cần xóa dòng số 27 trong số này (dòng số 27 là dòng ACL , quy chuẩn, quy tắc, cấu hình), tôi có thể chỉnh sửa từng tệp hoặc tôi có thể đạt được những gì tôi cần bằng lệnh khát và một tập lệnh bash (tùy chọn).

Tuy nhiên, hãy thử một tệp đơn giản.

Chúng tôi có tệp bản phân phối-deb.txt chứa cái này:

debian

Ubuntu

archlinux

chất tan

bạc hà

Đó là, tệp bản phân phối-deb.txt trong đó chúng ta sẽ đặt các bản phân phối dựa trên Debian, nhưng ở dòng số 3 có "Archlinux", một bản phân phối rõ ràng không liên quan gì đến Debian, vì vậy chúng ta phải loại bỏ dòng đó. Để loại bỏ dòng số 3 của tệp đó, chúng tôi sẽ đặt như sau:

sed "3d" distros-deb.txt > distros-deb-ok.txt

Giải thích dòng này hơi dễ, với khát "3d" chúng tôi cho biết rằng chúng tôi sẽ xóa dòng số 3, với bản phân phối-deb.txt Chúng tôi cho biết tệp nào sẽ hoạt động, tức là xóa dòng số 3 của tệp này, đến đây nếu chúng tôi nhấn Enter, nó sẽ hiển thị cho chúng tôi những gì chúng tôi muốn nhưng trong thiết bị đầu cuối, vì vậy với > distros-deb-ok.txt chúng tôi chỉ ra rằng thay vì hiển thị kết quả trong terminal, nó sẽ đặt nó vào một tệp có tên này.

Đơn giản là gì?

Ngoài ra, chúng ta có thể tránh sử dụng > distros-deb-ok.txt sử dụng một tham số thích hợp của khát, thông số -i

Tức là, trong trường hợp chúng ta muốn xóa dòng khỏi tệp và lưu nó với cùng tên (chứ không phải trong tệp khác), chỉ cần thêm tham số -i :

sed -i "3d" distros-deb.txt

Thao tác này sẽ xóa dòng số 3 khỏi distros-deb.txt và lưu nó.

Điều gì xảy ra nếu tôi muốn có một loạt các dòng, nghĩa là loại bỏ dòng # 3 mà còn cả # 4 và # 5? Để đạt được điều này, chúng tôi đặt phạm vi từ 3 đến 5, nghĩa là:

sed -i "3,5d" distros-deb.txt

Và nó sẽ chỉ hiển thị cho tôi debian và kubuntu 😀

Vậy nếu tôi muốn xóa từ dòng 2 đến dòng cuối cùng, khi tôi không biết tổng số dòng thì sao?

Chỉ cần sử dụng ký hiệu đô la - »$

sed -i "2,$d" distros-deb.txt

Trong trường hợp bạn muốn loại bỏ từ dòng đầu tiên xuống # 4 thì chúng tôi chỉ cần đặt giá trị 1 ở đầu:

sed -i "1,4d" distros-deb.txt

Đây là tất cả mọi thứ, một mẹo rất hữu ích khi bạn muốn tạo tập lệnh bash để tự động hóa các tác vụ và bạn cần sửa đổi và loại bỏ các dòng tệp cấu hình, để sửa đổi chúng ta có thể sử dụng khát o perl, cũng như để loại bỏ, chúng tôi đã biết cách làm điều đó với sed 😉

Liên quan


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   mss-devel dijo

    Đóng góp rất tốt 😉

    1.    KZKG ^ Gaara dijo

      thanks

      Nhân tiện, chúng tôi đã nhận được email của bạn ngay bây giờ, tôi sẽ trả lời bạn 😀

      Liên quan

  2.   không tên dijo

    Với tư cách là thầy tu cao cấp của thiết bị đầu cuối, máy chủ và kết nối ssh, tôi đến với bạn, tuyệt vời KZKG ^ Gaara, và tôi hỏi bạn: tôi có thể lấy hướng dẫn ở mức độ thiếu hiểu biết của mình ở đâu cho phép tôi sử dụng kết nối ssh giữa hai máy từ xa trên các mạng khác nhau để chia sẻ các tập tin văn bản, pdf, hình ảnh và âm thanh (mp3)….

    ????

    Nghiêm túc đấy, bạn có thể hướng dẫn tôi vấn đề này không, tôi có hai máy, một máy ở cơ quan và một máy ở nhà và tôi cần kết nối ssh giữa chúng (vì theo tôi hiểu, ssh cho phép chia sẻ nội dung giữa các máy, tôi nói đúng không?
    Và nếu tôi sai, bạn giới thiệu ứng dụng nào?
    Và tôi phải tìm một hướng dẫn cơ bản về vấn đề này ở đâu?

    1.    -gián điệp- dijo

      scp

      scp user @ machine_address: đường dẫn user @ machine_address: đường dẫn.

      Cú pháp tương tự như cp, nguồn -> đích.

  3.   f3niX dijo

    Bạn đã xuất hiện, bạn đã bị mất.

  4.   Joaquin dijo

    Mẹo tốt!

  5.   LycusHackerEmo dijo

    Mẹo thú vị… xD

    Bạn có tình cờ biết một thứ làm cho văn bản in đậm nổi bật không?
    Ý tôi là, tôi có một tệp txt là một từ điển, nó có hơn 10000 dòng và tôi muốn nó làm nổi bật văn bản nhất định trước các điểm tạm ngưng ":" và làm từng cái một là quá nhiều.

    1.    KZKG ^ Gaara dijo

      Xin chào,

      Một tệp txt là văn bản thuần túy, như tên gọi của nó ... đơn giản, không có định dạng hoặc bất kỳ điều gì tương tự, tôi xin lỗi nhưng tôi nghĩ rằng những gì bạn yêu cầu không thể thực hiện được, có thể không? 🙁

      Liên quan

      1.    aca dijo

        thực sự nó có thể, nhưng bạn sẽ phải biết định dạng đích.
        ví dụ:
        echo $ (echo "Robert: Xin chào. Thay đổi ở đây" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        đó là một vấn đề đối phó.
        cách khác để xóa có thể được sử dụng là sed '/' $ 1 '/ d' nhưng bạn phải chắc chắn về điều đó.

        1.    LycusHackerEmo dijo

          sau đó hoàn tất lưu nó trong * .odt

          Không có cách nào dễ dàng hơn để làm điều đó với LibreOffice?

  6.   Lolo dijo

    Bạn có thể xóa một phần của dòng và để lại phần còn lại không?

    Giả sử tôi muốn xóa mọi thứ trước một từ trong một hàng nhất định.

    Hoặc xóa mọi thứ theo sau từ đó.

    1.    aca dijo

      Vâng, đó là vấn đề của việc kéo một regex (nếu cần thì man sed -r, –regexp-Extended)
      Bắt đầu từ những gì tôi tìm thấy
      echo «Robert: Xin chào. Thay đổi tại đây »| sed 's / Thay đổi //'
      với một mẫu được xác định rõ ràng và với. (một ký tự) và * (nhiều hơn một)
      Sau đó:
      echo «Robert: Xin chào. Thay đổi tại đây »| sed 's / Thay đổi. * //'
      Trước:
      echo «Robert: Xin chào. Thay đổi tại đây »| sed 's /. * Thay đổi //'
      Nếu từ đó xuất hiện quan trọng
      echo «Robert: Xin chào. Thay đổi tại đây »| sed 's / Thay đổi. * / Thay đổi /'
      hoặc phức tạp hơn
      trong dòng chứa Robert những gì xảy ra sau Thay đổi
      echo -e «Fritz: Xin chào. Thay đổi ở đây \ nRobert: Xin chào. Thay đổi tại đây »| sed '/Robert/s/Cambio.*//'
      hoặc như ở phần đầu, hãy lấy ra dòng thứ hai và xử lý phần còn lại
      echo -e «Fritz: Xin chào. Thay đổi ở đây \ nRobert: Xin chào. Thay đổi ở đây \ nKhác »| sed -e 2d -e 's / Thay đổi. * //'
      echo -e «Fritz: Xin chào. Thay đổi ở đây \ nRobert: Xin chào. Thay đổi ở đây \ nKhác »| sed '2d; s / Thay đổi. * //'

      1.    Lolo dijo

        Cảm ơn bạn, nó rất hữu ích cho tôi.

  7.   msx dijo

    Bài viết hay, tôi thích, SysAdmin tuyệt vời làm sao!
    Cuộc sống của chúng ta sẽ ra sao nếu không có sed, awek, perl, grep, tail, head, "Emacs" và rất nhiều công cụ thiết yếu khác !?

  8.   Lisbeth Ollarves dijo

    Cảm ơn, nó rất hữu ích.

  9.   Ghim dijo

    Xin chào, và làm thế nào bạn có thể xóa các dòng 1,4 và 10 khỏi một tệp trong cùng một lệnh?