Công cụ POSIX cho các chỉnh sửa theo kịch bản của một tệp (thay vì in các nội dung đã sửa đổi thành tiêu chuẩn) ex
.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Tất nhiên bạn có thể sử dụngsed -i
nếu phiên bản Sed của bạn hỗ trợ nó, chỉ cần lưu ý rằng nó không khả dụng nếu bạn đang viết một tập lệnh dự định chạy trên các loại hệ thống khác nhau.
David Foerster hỏi trong các ý kiến:
Có một lý do tại sao bạn đang sử dụng printf
và không echo
hoặc một cái gì đó như thế ex -c COMMAND
?
Trả lời có.
Đối printf
với echo
nó là một câu hỏi về tính di động; xem Tại sao printf tốt hơn echo? Và nó cũng dễ dàng hơn để xen kẽ các dòng mới giữa các lệnh sử dụng printf
.
Đối printf ... | ex
với so với ex -c ...
, đó là một câu hỏi về xử lý lỗi. Đối với lệnh cụ thể này, nó sẽ không thành vấn đề, nhưng nói chung là không; ví dụ: thử đặt
ex -c '%s/this pattern is not in the file/replacement text/g | x' filename
trong một kịch bản. Tương phản với những điều sau đây:
printf '%s\n' '%s/no matching lines/replacement/g' x | ex file
Đầu tiên sẽ treo và chờ đầu vào; cái thứ hai sẽ thoát khi nhận được EOF bởi ex
lệnh, vì vậy đoạn script sẽ tiếp tục. Có các cách giải quyết khác, chẳng hạn như s///e
, nhưng chúng không được chỉ định bởi POSIX. Tôi thích sử dụng các hình thức di động, được hiển thị ở trên.
Đối với g
lệnh, phải có một dòng mới ở cuối và tôi thích sử dụng printf
để bọc các lệnh hơn là nhúng một dòng mới trong dấu ngoặc đơn.
awk
phân cách trường!