Giải thích về sed: tập tin sed '/./,$!d'


7

Ai đó có thể vui lòng giải thích mã này xóa tất cả các dòng trống hàng đầu ở đầu tệp:

sed '/./,$!d' file

Tôi hiểu rằng đó là một biểu thức chính quy, chỉ khớp với ký tự đầu tiên, nhưng sau đó không hiểu phần, $! D. Đây có phải là những gì nó được thay thế bởi, hoặc họ là lựa chọn cho trận đấu?

Đây có phải là một lệnh tìm kiếm nếu nó không bắt đầu bằng 's /' ...?

Mã nguồn (từ một câu hỏi khác)

Câu trả lời:


12
sed '/./,$!d'

Từ dòng đầu tiên chứa ký tự (trống hoặc không) đến cuối tệp - phủ định (có nghĩa là từ đầu tệp đến dòng trước dòng đầu tiên chứa ký tự) - xóa.

Điều này xóa các dòng trống hàng đầu , không phải dòng trống. Để xóa các dòng trống hàng đầu (các dòng trống hoặc chỉ chứa các ký tự khoảng trắng) '/\S/,$!d'.

Đọc "Sed, giới thiệu và hướng dẫn" tại http://www.grymoire.com/Unix/Sed.html . Sau đó đọc hướng dẫn tham khảo tại https://www.gnu.org/software/sed/manual/sed.html .

Nói ngắn gọn:

  • Dạng chung của sedlệnh là [bộ chọn] lệnh [phủ định] [cờ] (dấu ngoặc vuông cho biết các phần tùy chọn)

  • Bộ chọn, nếu có, chọn các dòng mà lệnh áp dụng

  • Nếu !xuất hiện, nó phủ nhận bộ chọn, nghĩa là, làm cho lệnh áp dụng cho các dòng không khớp với bộ chọn.

  • Nếu không có bộ chọn thì lệnh áp dụng cho tất cả các dòng.

  • Bộ chọn có thể chọn một dòng (theo số) hoặc một tập hợp các dòng (theo biểu thức chính quy) hoặc các dòng giữa một dòng bắt đầu (theo số hoặc biểu thức chính quy) và một dòng kết thúc (theo số hoặc biểu thức chính quy).

  • Trong trường hợp của chúng tôi, bộ chọn /./,$có nghĩa là từ dòng đầu tiên được tìm thấy khớp /./(nghĩa là chứa ít nhất một ký tự) đến cuối tệp ( $được sử dụng làm số dòng và có nghĩa là dòng cuối cùng trong tệp).

  • Nó bị phủ định bởi !, do đó lệnh áp dụng cho các dòng từ đầu tệp đến dòng trước khi khớp dòng đầu tiên /./.

  • Lệnh dxóa các dòng đã chọn.


Bạn có thể vui lòng giải thích từng điều riêng lẻ không? Dấu phẩy làm gì? Tôi biết $ có nghĩa là kết thúc chuỗi. Tôi đoán là vậy! có nghĩa là phủ định? Làm thế nào mà nó đi đến điểm xác định điểm "bắt đầu của tệp đến dòng trước điểm đầu tiên chứa ký tự"?
Emerson Peters

Là, $! D là một phần của phần thay thế, hoặc chúng là các tùy chọn như nơi g cho tìm kiếm toàn cầu sẽ đi đâu?
Emerson Peters

Tôi đã mở cả hai tab đó, nhưng không thể tìm thấy tài liệu tham khảo về các tùy chọn / lệnh này trong mục lục hoặc thông qua việc đọc lướt nhanh, vì vậy tôi không biết tìm ở đâu. Có vẻ như tôi chỉ cần một sự hiểu biết toàn cầu hơn về sed trước tiên. Cảm ơn bạn đã đi vào chi tiết. Tôi sẽ sử dụng điều này như tài liệu tham khảo khi học sau này. :)
Emerson Peters
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.