Tùy chọn `-n` trong sed làm gì?


13

Đây là mục người đàn ông cho -n:

-n

ngăn chặn tự động in không gian mẫu

Tôi nhận thấy rằng khi không sử dụng -ncho một số thao tác nhất định, mỗi dòng được in thành thiết bị xuất chuẩn (và các dòng được yêu cầu được in hai lần):

$ cat test.txt 
first
second
third
fourth
fifth

$ sed -n '2,3p' test.txt 
second
third

$ sed '2,3p' test.txt 
first
second
second
third
third
fourth
fifth

Tuy nhiên, luật này không áp dụng cho các lệnh khác:

$ sed -n 's/t/T/' test.txt 

$ sed 's/t/T/' test.txt 
firsT
second
Third
fourTh
fifTh

Vì vậy, những gì -nlàm, chính xác?

Câu trả lời:


17

Thông thường, sed xử lý từng dòng (thực hiện thay thế, v.v.), sau đó in kết quả. Nếu quá trình xử lý liên quan đến dòng được in (ví dụ plệnh của sed ), thì nó sẽ được in hai lần (một lần trong khi xử lý, sau đó một lần nữa bằng bản in xử lý hậu tự động). Các -ntùy chọn vô hiệu hóa việc in ấn tự động, có nghĩa là dòng bạn không đặc biệt nói với nó để in không được in, và các dòng bạn nói một cách rõ ràng để in (ví dụ với p) được in một lần duy nhất.

  • sed -n '2,3p' test.txt - chỉ in các dòng 2 đến 3, theo yêu cầu

  • sed '2,3p' test.txt - in từng dòng (tự động), VÀ CSONG in các dòng 2-3 lần thứ hai

  • sed -n 's/t/T/' test.txt - thay thế "t" bằng "T" trên mỗi dòng, nhưng không in kết quả do -n

  • sed 's/t/T/' test.txt - thay thế "t" bằng "T" trên mỗi dòng và tự động in kết quả

Và hãy để tôi thêm một số ví dụ:

  • sed -n 's/t/T/p' test.txt - thay thế "t" bằng "T" trên mỗi dòng, in CHỈ các dòng nơi thay thế diễn ra (tức là không phải "thứ hai")

  • sed 's/t/T/p' test.txt - thay thế "t" bằng "T" trên mỗi dòng, in các dòng nơi thay thế diễn ra, sau đó tự động in từng dòng (kết quả: "giây" được in một lần, tất cả các dòng khác hai lần)

  • sed '2,3p; 3p' test.txt- in các dòng 1, 4 và 5 một lần (in tự động); dòng 2 hai lần ( plệnh đầu tiên sau đó tự động in) và dòng 3 ba lần (một lần cho mỗi plệnh, sau đó lại tự động).


Cảm ơn Gordon nhưng đánh giá của bạn chỉ lặp lại quan sát của tôi. Trong hai ví dụ đầu tiên sed mà không -nin ra mỗi dòng ngoài những dòng được yêu cầu cụ thể. Do đó, trong trường hợp đó, -n ngăn chặn việc in của mỗi dòng được phân tích cú pháp . Tuy nhiên trong các ví dụ thứ ba và thứ tư, hành vi là khác nhau. Trong những trường hợp đó, sed mà -nkhông xuất ra các dòng hai lần, do đó, việc sử dụng -nkhông ngăn chặn việc in của mỗi dòng được phân tích cú pháp mà thay vào đó sẽ ngăn chặn việc in các dòng không bị thay đổi . Tôi đang gặp khó khăn trong việc khái quát hóa khi hành vi sẽ là cái này hay cái khác.
dotancohen

Không, trong cả hai trường hợp -nđều thực hiện chính xác cùng một điều: chuyển từ mỗi dòng được in tự động (và trình sửa đổi pplệnh thay thế khiến dòng được in thêm lần) sang chế độ chỉ in dòng nếu bạn nói cụ thể đến (với plệnh vv).
Gordon Davisson

Đặt nó theo một cách khác: thử thêm -ntùy chọn VÀ CSONG thêm ; pvào lệnh sed (ví dụ: sed -n '2,3p; p'và bạn sẽ nhận được kết quả giống như bạn có mà không cần. Việc -nloại bỏ bản in tự động mặc định và ; pthêm phần rõ ràng (hầu hết tương đương ) in.
Gordon Davisson

Tôi thấy bây giờ, cảm ơn bạn. Tôi rất đánh giá cao việc bạn dành thời gian để giúp làm cho ví dụ rõ ràng. Có một tuần tuyệt vời!
dotancohen
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.