2017-04-02 21 views
7

Tôi có đoạn mã bash sau đây lặp lại cho mỗi hình ảnh được tìm thấy. Nó cần phải lặp qua tất cả các tệp html, cssjs và thay thế tất cả các lần xuất hiện của một hình ảnh trong tệp đó.Sed cung cấp: sed: không thể đọc: Không có tệp hoặc thư mục nào như vậy

for image in app/www/images-theme-dark/*.png 
    do 
     echo "installing icon" $image 

     # extract filename from iconpath 
     iconfile=$(basename $image) 
     iconPath="images/"$(basename $image) 

     # replace paths in all files containing icon paths 
     find app/www -type f \(-name "*.html" -or -name "*.css" -or -name "*.js" \ 
          -or -name "*.appcache" \) \ 
      -exec sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}" \; 

    done 

Tuy nhiên khi tôi chạy kịch bản sed cho:

sed: can't read : No such file or directory

On StackOverflow tôi đã tìm thấy sed: can't read : No such file or directory Nhưng tôi đã có dấu ngoặc kép quanh {}

Khi Tôi xin nhắc lại lệnh sed và và thực hiện nó trên dòng lệnh bằng tay không có lỗi.

Tôi đang sử dụng GNU v4.2.2 sed trên Raspbian GNU/Linux 8.0 (jessie)

Có ai nhìn thấy những gì có thể sai ở đây?

+1

Btw: xem: [Sự khác biệt giữa dấu nháy đơn và kép trong bash] (http://stackoverflow.com/q/6697753/3776858) – Cyrus

+2

'''' sau 'sed -i' là gì? – melpomene

+0

@melpomene nó ngăn cản sed tạo tệp sao lưu và thay thế trực tiếp trong tệp thay vì –

Trả lời

6

(Biên soạn câu trả lời từ các ý kiến, bí quyết là bởi Melpomene và AlexP.)

là gì mà '' sau sed -i?

-i có nghĩa là tại chỗ, tức là, chỉnh sửa trực tiếp trong tệp.
-i '' có nghĩa là chỉnh sửa tại chỗ tệp có tên là chuỗi trống.
Vì có lẽ không có tệp nào có tên là chuỗi rỗng, sed phàn nàn rằng nó không thể đọc được.

Note 1 nền tảng phụ thuộc:
Cú pháp của -i là một sự khác biệt giữa GNU sed và sed từ mac os.

Note 2 "bình thường" để các đối số:
Các -e switch để chỉ mã sed cho phép có nó ở giữa tên tập tin.
Đây là một cái bẫy (trong đó tôi ví dụ đã bắt gặp một cách ngượng nghịu), bằng cách làm cho bạn vượt qua mong đợi của bạn về những gì bạn tìm thấy ở đâu trong dòng lệnh sed.
Nó cho phép
sed -i filename -e "expression" AnotherFileName
mà là một phiên bản vô tình ngụy trang của
sed -i'NoExtensionGiven' "expression" filename AnotherFileName.

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