2011-10-04 26 views
12

Tôi mới sử dụng shell script nhưng gặp phải lỗi này và không thể biết được điều gì đang xảy ra.Nhận lỗi sed

sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 

Đây là kịch bản tôi đang chạy

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    sed -i "s/HOSTNAME/${IP_ADDRESS}/g" $fl 
done 

Cảm ơn

Trả lời

43

Cho rằng sed dường như nghĩ rằng bạn đang chạy một lệnh delete line (d), bạn có thể muốn sản lượng lệnh để xem những gì thực sự là trong biến môi trường của bạn:

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    echo sed -i "s/HOSTNAME/${PSM_SERVER_ADDRESS}/g" $fl 
done 

Có khả năng tốt là PSM_SERVER_ADDRESS đang làm hỏng lệnh sed của bạn (và có thể cần phải được xử lý để làm sạch). Một cách để làm điều này (với điều kiện bạn có một gần đây đủ sed) sẽ được sử dụng delimiters không xuất hiện trong biến môi trường, ví dụ:

sed -i "s?HOSTNAME?${PSM_SERVER_ADDRESS}?g" $fl 

Vì bạn đã chấp nhận câu trả lời này, tôi cũng có thể thêm độ phân giải cho vấn đề bổ sung mà bạn tìm thấy. Có vẻ như BSD sed, không giống như Linux, có yêu cầu mà bạn cung cấp một phần mở rộng cho tùy chọn -i. Vì vậy, trong khi Linux cho phép:

sed -i "sed-command" 

để chỉnh sửa tại chỗ, các biến thể BSD cần có:

sed -i "" "sed-command" 

đi kèm hậu tố sao lưu trống rỗng.

Nếu không có, sed có thể sử dụng lệnh của bạn làm phần mở rộng và tên tệp đầu tiên của bạn làm lệnh.

+2

Có. Giá trị 'PSM_SERVER_ADDRESS' là một đường dẫn (có chứa'/'ký tự) để lệnh s diễn giải các ký tự'/'đó là các ký tự phân cách của nó (ví dụ' s/HOSTNAME // Users/davidkavanagh/path/g'. Có lẽ 's @ HOSTNAME @ $ {PSM_SERVER_ADDRESS}/g'. – jamessan

+0

IP_ADDRESS bằng một hàm nhận ip bằng tên máy chủ -i để sử dụng trên tất cả các nền tảng – daverocks

+0

@daverocks, bạn _still_ cần chạy tập lệnh đã sửa đổi Tôi đã cung cấp để có được dòng lặp lại, ngay cả với những thay đổi bạn đã thực hiện.Đó là cách duy nhất để biết những gì các lệnh được đưa ra để 'sed' là – paxdiablo