sed không thành công với tùy chọn không xác định của Lỗi đối với lỗi `s '


158

Tôi đang cố gắng sử dụng

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir

tuy nhiên tôi gặp lỗi này:

sed: -e expression #1, char 34: unknown option to `s'

Tôi không hiểu tại sao vì nó hoạt động hoàn hảo:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf

Có ý tưởng nào về những gì tôi đang làm sai không?

Đây có phải là vấn đề không? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"


8
Thông báo lỗi * BSD (bao gồm cả OSX) là "cờ xấu trong lệnh thay thế:" - bao gồm nó ở đây để làm cho điều này trở nên dễ hiểu hơn.
tripleee

Câu trả lời:


355

Vấn đề là với dấu gạch chéo: biến của bạn chứa chúng và lệnh cuối cùng sẽ giống như thế sed "s/string/path/to/something/g", chứa quá nhiều dấu gạch chéo.

sedcó thể lấy bất kỳ char nào làm dấu phân cách (mà không phải khai báo dấu phân cách mới), bạn có thể thử sử dụng một ký tự khác không xuất hiện trong chuỗi thay thế của bạn:

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

Lưu ý rằng đây không phải là bằng chứng dấu đầu dòng: nếu chuỗi thay thế sau này chứa @nó sẽ bị phá vỡ vì cùng một lý do và bất kỳ chuỗi dấu gạch chéo ngược nào như \1vẫn sẽ được diễn giải theo sedquy tắc. Sử dụng |như một dấu phân cách cũng là một lựa chọn tốt vì nó tương tự về khả năng đọc /.


38
Chỉ cần một lưu ý để giúp người dùng trong tương lai, như tôi thấy câu trả lời này cũng hữu ích. Các poster ban đầu rất có thể có một cái gì đó trong sự thay thế của anh ấy (rất có thể được ẩn trong biến) có chứa dấu gạch chéo về phía trước. Sau khi gặp phải một trong những dấu gạch chéo đầu tiên, sed đã xem xét việc thay thế chấm dứt và bất cứ điều gì xảy ra tiếp theo là một tùy chọn (chẳng hạn như g).
Brian Warshaw

4
Độc đáo được thực hiện (Chỉ cần nhớ để bọc biểu thức biến với "không 'nếu không bạn sẽ nhận được rất nhiều $contenttrong kết quả cuối cùng của bạn thay vì nội dung của $content:))

1
@ AbTHERDissonance Có thể nếu bạn đang thay thế mật khẩu hoặc thứ gì đó kỳ lạ hoặc ngẫu nhiên, bạn vẫn có @ trong đó. Bạn phải tìm một dấu phân cách không có trong chuỗi thay thế của bạn.
Xavi Montero

5
@ppumkin chỉ cần thay thế các dấu phân cách "dấu gạch chéo" như tức là: sed -i "s/../../g"với ký tự khác nhau tức là : sed -i "s@...@...@g", thì vấn đề nhiều dấu gạch chéo sẽ biến mất. Và nếu bạn sử dụng "thay vì 'nó cũng sẽ hoạt động tốt với các biến bên trong, tức là : export var1=bar; sed -i "s@foo@${var1}@g". Thông tin thêm bạn có thể tìm thấy trong tài liệu sed tuyệt vời: grymoire.com/Unix/Sed.html
Egel

1
Xem info sed(nguồn: unix.stackexchange.com/questions/259083/, ): "Cú pháp của lệnh s (như thay thế) là 's / regapi / thay thế / flags'. Các ký tự / có thể được thay thế thống nhất bởi bất kỳ ký tự đơn trong bất kỳ lệnh s đã cho nào. "
Gabriel Staples
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.