Giả sử bạn muốn thay thế dòng 4 với nội dung "khác biệt". Bạn có thể sử dụng AWK như sau:
awk '{ if (NR == 4) print "different"; else print $0}' input_file.txt > output_file.txt
AWK xem đầu vào là "bản ghi" được chia thành "trường". Theo mặc định, một dòng là một bản ghi. NR
là số bản ghi được xem. $0
đại diện cho bản ghi hoàn chỉnh hiện tại (trong khi $1
là trường đầu tiên từ bản ghi và vân vân; theo mặc định các trường là các từ trong dòng).
Vì vậy, nếu số dòng hiện tại là 4, in chuỗi "khác" nhưng nếu không in dòng không thay đổi.
Trong AWK, mã chương trình được đính kèm trong { }
chạy một lần trên mỗi bản ghi đầu vào.
Bạn cần báo giá chương trình AWK trong một dấu nháy đơn để ngăn trình cố giải thích những thứ như $0
.
EDIT: Một chương trình AWK ngắn hơn và thanh lịch hơn từ @chepner trong các ý kiến dưới đây:
awk 'NR==4 {$0="different"} { print }' input_file.txt
Chỉ cho kỷ lục (ví dụ: dòng) số 4, thay thế toàn bộ kỷ lục với chuỗi "khác nhau". Sau đó cho mỗi bản ghi đầu vào, in bản ghi.
Rõ ràng kỹ năng AWK của tôi đã bị gỉ! Cảm ơn bạn, @chepner.
EDIT: và xem thêm một phiên bản thậm chí ngắn hơn từ @Dennis Williamson:
awk 'NR==4 {$0="different"} 1' input_file.txt
Làm thế nào các công trình này được giải thích trong các ý kiến: các 1
luôn đánh giá đúng, vì vậy khối mã liên quan luôn luôn chạy. Nhưng không có khối mã liên quan, có nghĩa là AWK làm hành động mặc định của nó chỉ in toàn bộ dòng. AWK được thiết kế để cho phép các chương trình terse như thế này.
Có cách nào để làm cho sed sửa đổi các tập tin trong câu hỏi thay vì bán phá giá để sàng lọc? – user788171
Tôi bây giờ nhấn với sed: tùy chọn bất hợp pháp - tôi có một sửa chữa cho điều này? – user788171
cài đặt cổng sudo sed? bạn đang dùng mac à? nếu vậy, chỉ cần sử dụng phiên bản * nix –