2012-08-13 14 views
9

Tôi đã thử lệnh này,Làm thế nào để thay thế một chuỗi trong nhiều tập tin bằng cách sử dụng grep và sed khi đối số -i không được hỗ trợ?

grep '/static' dir/* | xargs sed -i 's/\/static//g' 

nhưng phiên bản sed Tôi đang sử dụng không hỗ trợ lập luận -i.

Để thay thế một chuỗi trong một tập tin, các tập tin đầu vào tương tự như đầu ra, tôi thường làm điều này:

sed 's/\/static//g' filename.txt > new_filename.txt ; mv new_filename.txt filename.txt 

Trả lời

23

phiên bản của sed OS X không hỗ trợ -i, nhưng nó đòi hỏi một cuộc tranh cãi để cho nó tập tin những gì mở rộng để sử dụng cho các tập tin sao lưu (hoặc "" cho không có dự phòng). BTW, bạn muốn grep -l chỉ lấy tên tệp.

grep -l '/static' dir/* | xargs sed -i "" 's/\/static//g' 
+0

Đã hoạt động! Tôi đã không đưa ra một phần mở rộng cho các tập tin sao lưu. Trowing rằng trong đó làm cho nó hoạt động. Điều này chắc chắn dễ nhớ hơn là trải qua vòng lặp for. Cảm ơn! – davierc

3

Sử dụng perl:

$ perl -pi.bak -e '[email protected]/[email protected]@g' dir/* 
+0

Tôi đã hy vọng có câu trả lời bằng grep và sed vì tôi không biết lick perl. Cảm ơn vi đa trả lơi. – davierc

+0

Trong trường hợp giới hạn này, Perl khá giống với 'sed'. Bạn có thể chuyển đổi các kịch bản lệnh 'sed' đơn giản thành Perl bằng công cụ' s2p'. – tripleee

1

Bạn có thể làm điều này bằng cách sử dụng vòng lặp :

for file in $(grep -l '/static' dir/*) ; do 
    sed 's/\/static//g' $file > $file.$$ && mv $file.$$ $file 
done 

tôi sử dụng .$$ hậu tố ($$ là quá trình id của Shel hiện tại l) để tránh va chạm với tên tập tin hiện có, và && thay vì ; để tránh ghi đè tệp đầu vào nếu lệnh sed không thành công vì một số lý do. Tôi cũng đã thêm -l để grep in tên tệp hơn là so khớp các dòng.

Hoặc bạn có thể cài đặt GNU sed (Tôi không chắc chắn chính xác cách thực hiện điều đó trên OSX).

+0

Không nên lệnh 'grep' in tên tệp thay vì các dòng có kết quả phù hợp, như' $ (grep --files-with-matches '/ static' dir/*) '? – Birei

+0

@Birei: Khá đúng (tôi đã sao chép lệnh grep từ câu hỏi, nên đã kiểm tra cẩn thận hơn). Đã cập nhật câu trả lời. –

+0

Cảm ơn bạn đã sử dụng mẹo. $$. Điều này hoạt động hoàn hảo, và sau khi đọc thêm tôi hiểu nó hoàn toàn. Darn xấu hổ không có công việc xung quanh nơi tôi có thể sử dụng một lớp lót đơn giản. – davierc