2010-03-25 34 views
8

được đưa ra một tài liệu văn bản đơn giản với một vài dòng như:Thêm vào cuối dòng với sed

c48 7.587 7.39 
c49 7.508 7.345983 
c50 5.8 7.543 
c51 8.37454546 7.34 

tôi cần phải thêm một số thông tin 2 không gian sau khi kết thúc dòng, vì vậy cho mỗi dòng tôi sẽ get:

c48 7.587 7.39 def 
c49 7.508 7.345983 def 
c50 5.8 7.543 def 
c51 8.37454546 7.34 def 

Tôi cần thực hiện việc này cho hàng nghìn tệp. Tôi đoán điều này là có thể làm với sed, nhưng không biết làm thế nào để. Bất kỳ gợi ý nào? Bạn cũng có thể cho tôi một số liên kết với một hướng dẫn hoặc bảng cho trường hợp này?

Cảm ơn

Trả lời

14

nếu tất cả các file của bạn nằm trong một thư mục

sed -i.bak 's/$/ def/' *.txt 

để làm điều đó đệ quy (GNU tìm)

find /path -type f -iname '*.txt' -exec sed -i.bak 's/$/ def/' "{}" +; 

bạn có thể thấy here cho giới thiệu đến sed

Các cách khác y ou có thể sử dụng,

awk

for file in * 
do 
    awk '{print $0" def"}' $file >temp 
    mv temp "$file" 
done 

Bash shell

for file in * 
do 
    while read -r line 
    do 
     echo "$line def" 
    done < $file >temp 
    mv temp $file 
done 
+1

Có gì '+;'? Tôi luôn luôn sử dụng '\;'. Các manpage bash không làm cho tôi bất kỳ khôn ngoan hơn. – Thomas

+0

ở đó trong trang GNU 'find's'. nó tương đương với 'xargs' – ghostdog74

+0

hi, cái này thật tuyệt. chỉ là một câu hỏi ngắn, làm thế nào có thể awk '{print $ 0 "def"}' $ file> temp được áp dụng cho một số dòng cụ thể của tập tin? – flow

3
for file in ${thousands_of_files} ; do 
    sed -i ".bak" -e "s/$/ def/" file 
done 

Mấu chốt ở đây là tìm kiếm và thay thế s/// lệnh. Ở đây chúng tôi thay thế kết thúc của dòng $ với 2 khoảng trắng và chuỗi của bạn.

Tìm tài liệu sed tại http://sed.sourceforge.net/#docs

+0

thanks a lot. chỉ một câu hỏi, làm điều này trên OSX, tại sao ký tự "^ M" xuất hiện? – flow

+0

IIRC, dòng cuối cùng - ký tự kết thúc EOL (s) trong Unix, Mac và Windows đều khác nhau. 'sed' là một tiện ích Unix, vì vậy nó sử dụng quy ước Unix, tức là kết thúc mỗi dòng với Carriage Return - CR (^ M), trong khi mac sử dụng Line Feed - LF (^ L), Windows BTW sử dụng CR, LF. Điểm chính là bạn bị bỏ lại với ký tự Unix EOL. Tôi không phải là một guru Mac, nhưng cần có một tiện ích để sửa lỗi này. Trên hộp Linux của tôi có 'dos2unix' và' unix2dos', nhưng nếu bạn không thể tìm thấy công cụ như vậy, hãy thử sử dụng 'tr '\ r' '\ f'' để có hiệu ứng tương tự. –

+0

Một lưu ý, máy Mac sử dụng CR (^ M) ('\ r') cho đến OS X, tại thời điểm đó họ chuyển sang LF (^ L) ('\ n'). UNIX luôn sử dụng LF (^ L). Bạn đúng khi bạn nói rằng Windows sử dụng CRLF (^ M^L) ("\ r \ n"). – amertune

Các vấn đề liên quan