2013-07-08 21 views
19

Tôi muốn chạy một lệnh đơn giản thay thế đường dẫn tuyệt đối cho những người thân bên trong một file CSS như thế này:sed ném 'cờ xấu trong lệnh thay thế'

sed -i 's/\/fonts/../fonts/' /Users/sergeybasharov/WebstormProjects/snap/compiled/Content/stylesheets/style.css 

Nó ném này

sed: 1: "/Users/sergeybasharov/W ...": bad flag in substitute command: 'b' 

Điều gì có thể sai trong kịch bản đơn giản này?

+0

Không 'b' bất cứ nơi nào trong lệnh của bạn, nó không phải là những gì bạn thực sự gõ. Vui lòng dán tập lệnh thực tế. – Barmar

+0

Có, thực sự, chỉ cần sử dụng một tương đương ngắn hơn :). Tôi đã cập nhật lên phiên bản đầy đủ. –

+0

Có một số vấn đề với trích dẫn của bạn khiến tên tệp được bao gồm trong lệnh subsitute, nhưng tôi không thấy nó trong những gì bạn đã trích dẫn. Bạn đang thiếu một dấu gạch chéo ngược, mặc dù. – Barmar

Trả lời

35

Trong lệnh của bạn s/\/fonts/../fonts/ đang được thực hiện như là các tham số cho -i tùy chọn (hậu tố để sử dụng cho các tập tin sao lưu), và đối số tên tập tin đang được điều trị như các lệnh chỉnh sửa.

Bạn cần phải xác định để vô hiệu hóa việc tạo ra tập tin sao lưu:

sed -i '' ... 

Trong ví dụ của bạn:

sed -i '' 's/\/fonts/../fonts/' /Users/sergeybasharov/WebstormProjects/snap/compiled/Content/stylesheets/style.css 

Máy vi tính là câm, họ không tìm điều hành bởi bối cảnh, để họ có thể không cho biết điều gì đó bắt đầu bằng s/rõ ràng là lệnh chỉnh sửa, không phải là hậu tố.

+0

+1, thú vị, trong Windows Tôi không có vấn đề này, tôi phải luôn luôn sử dụng dấu ngoặc kép. – Endoro

+0

@Endoro Loại báo giá không liên quan trong trường hợp này, điều quan trọng là bạn phải có một đối số rõ ràng ở đó. – Barmar

+0

Có thể trong 'OSX' sed, trong' GNU' sed '-i' hoạt động mà không có đối số. Điều cần biết :) – Endoro

9

sed -i 's/\/fonts/../fonts/' không phải là một lệnh sed hợp lệ, hãy thử sed -i 's#/fonts#../fonts#'

+1

Đúng, nhưng nó không gây ra lỗi cụ thể này. – Barmar

+0

Hoàn toàn quên bạn có thể sử dụng các dấu phân cách khác nhau trong sed. Điều này đã giải quyết được vấn đề của tôi vì sự thay thế của tôi chứa dấu gạch chéo. Rực rỡ! – TryTryAgain

6

Tôi gặp sự cố tương tự. Bạn có thể cài đặt phiên bản GNU của sed trong máy Mac, được gọi là gsed và sử dụng nó bằng cú pháp Linux chuẩn.

Đối với điều đó, cài đặt gsed bằng cách sử dụng cổng (nếu bạn không có nó, có được nó tại http://www.macports.org/) bằng cách chạy cài đặt cổng sudo gsed. Sau đó, bạn có thể chạy gsed -i 's/old_pattern/new_pattern/g' *

+5

Tương đương nếu sử dụng homebrew là brew install gnu-sed – rich

+1

omg, đó là một trình tiết kiệm cuộc sống – ling