Làm thế nào để lệnh sed này hoạt động?


12

Tôi đã gặp giải pháp này để in một dòng cụ thể từ tệp văn bản:

sed '123!d;q' file

Tại sao sed không bỏ sau dòng đầu tiên trong trường hợp này?

Câu trả lời:


20

Trong tiếng Anh, sedchương trình này có nghĩa là: cho mỗi dòng,

  • [ 123!] nếu số dòng hiện tại không phải là 123, thì [ d] xóa dòng hiện tại và bắt đầu chu kỳ tiếp theo (tức là chuyển sang dòng tiếp theo);
  • sau đó (nhưng chúng tôi chỉ đạt đến điểm này nếu dlệnh không được thực thi), [ q] thoát mà không xử lý thêm bất kỳ dòng nào (nhưng in ra dòng hiện tại trong các đoạn chết của chúng tôi).

Hoặc nếu bạn thích, theo cú pháp shell:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done

Cảm ơn, điều đó cũng xóa nó cho tôi. Lỗi của tôi là tôi hiểu !là đã kết nối d, không phải 123.
rozcietrzewiacz

@Gilles: thiếu niềng răng {d;q;}, không nên qáp dụng cho mọi dòng (vì vậy chỉ đầu tiên)?
enzotib

1
@enzotib qáp dụng cho mọi dòng nơi nó được thực thi. Nhưng khi số dòng không phải là 123, dlệnh được thực thi và ý nghĩa của nó là bỏ qua ngay lập tức đến dòng đầu vào tiếp theo.
Gilles 'SO- ngừng trở nên xấu xa'

Lời giải thích rõ ràng
Rahul Patil

Về cơ bản, nó hoạt động giống như sed -n 123p(in cùng một đầu ra) ngoại trừ nó dừng sau dòng 123 thay vì xử lý hàng nghìn dòng có khả năng mà nó sẽ không bao giờ làm bất cứ điều gì với bất kỳ cách nào.
tự đại diện
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.