sed не вдається з помилкою "невідомий варіант до` s "


158

Я намагаюся використовувати

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

однак я отримую цю помилку:

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

Я не розумію, чому так прекрасно працює:

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

Будь-які ідеї щодо того, що я роблю неправильно?

Чи може це бути проблемою? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"


8
Повідомлення про помилку * BSD (включаючи OSX) - це «поганий прапор у команді-заміннику»: - включаючи його сюди, щоб зробити це дещо зручнішим.
tripleee

Відповіді:


355

Проблема полягає в косих рисах: ваша змінна містить їх, і остаточна команда буде чимось на зразок sed "s/string/path/to/something/g", що містить занадто багато косих.

Оскільки ви sedможете вважати будь-які знаки як роздільники (без необхідності оголошення нового роздільника), ви можете спробувати використати інший, який не відображається у вашій рядку заміни:

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

Зверніть увагу, що це не є кулезахисним: якщо рядок заміни пізніше містить, @вона порушиться з тієї ж причини, і будь-які послідовності зворотних косого ряду, як \1і раніше, інтерпретуються згідно з sedправилами. Використання |в якості роздільника також приємний варіант, оскільки він схожий на читабельність /.


38
Лише зауваження, щоб допомогти майбутнім користувачам, оскільки я вважаю цю відповідь корисною. Оригінальний плакат, швидше за все, мав щось на зміну (найімовірніше, приховане в змінній), що містило передні косої риски. Після того, як відбулася перша з цих косих, sed вважала заміну припиненою, і все, що було далі, як варіант (наприклад, g).
Брайан Варшо

4
Добре зроблено (Тільки НЕ забудьте обернути змінні вирази з "НЕ 'інакше ви отримаєте багато $contentв вашому кінцевий результат , а не зміст $content:))

1
@Ab абстрактDissonance Можливо, якщо ви замінюєте пароль або щось дивне або випадкове, у вас все ще є @. Ви повинні знайти роздільник, який не міститься у рядку заміни.
Хаві Монтеро

5
@ppumkin просто замініть розмежувачі прямої косої риси типу: sed -i "s/../../g"з різним символом, тобто:, sed -i "s@...@...@g"тоді проблема декількох косої риски повинна зникнути. А якщо використовувати "замість 'нього слід також добре працює зі змінними всередині, а саме: export var1=bar; sed -i "s@foo@${var1}@g". Більш детальну інформацію ви можете знайти в дивовижному SED документації: grymoire.com/Unix/Sed.html
Егелем

1
Див. info sed(Джерело: unix.stackexchange.com/questions/259083/… ): "Синтаксис команди s (як у заміннику)" s / regexp / заміна / прапори ". / Символи можуть бути рівномірно замінені будь-якими іншими один символ у будь-якій заданій s команді. "
Габріель Степлес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.