sed - áp dụng thay đổi trong nhiều tập tin


11

Tôi có hàng trăm tệp chứa " </foo:bar>"

cc
bb
aa
</foo:bar>
dd
xx
vv

Tôi muốn thay đổi tất cả chúng cùng một lúc để

cc
bb
aa
</foo:bar>

sed hoạt động tốt khi tôi đặt cho nó tên tập tin chính xác

sed -i "/ </ foo: bar> / q" 99999.txt

nhưng khi tôi cố gắng thay đổi tất cả chúng cùng một lúc thì tôi không có kết quả.

 sed -i "/<\/foo:bar>/q" *.txt

Câu trả lời:


19

Thử:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-s nói với sed để coi mỗi tập tin là riêng biệt.

Vì chúng tôi không muốn sedthoát cho đến khi tất cả các tệp được hoàn thành, chúng tôi thay đổi thành chỉ in từ đầu đến <\/foo:bar>và không in các dòng còn lại. -nnói với sed không in trừ khi chúng tôi yêu cầu nó rõ ràng. Lệnh 0,/<\/foo:bar>/pyêu cầu sed in bất kỳ dòng nào trong phạm vi từ đầu tệp đến dòng đầu tiên khớp <\/foo:bar>.

Các -stùy chọn là không có sẵn cho BSD / OSX sed.


@ fd0 Cảm ơn bạn. Trả lời cập nhật để lưu ý thiếu -strên BSD / OSX sed.
John1024

đối với GNU sed , -itùy chọn ngụ ý -s... có sedtriển khai giải pháp này không hoạt động mà không có -stùy chọn không?
Sundeep

7

Để dừng đọc các tập tin khi </foo:bar>được tìm thấy:

Với GNU awk:

gawk -i inplace '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

Với perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
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.