Сбой sed с ошибкой «unknown option to 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
@AbstractDissonance Возможно, если вы заменяете пароль или что-то странное или случайное, у вас все еще есть @. Вы должны найти разделитель, который не содержится в строке замещения.
Хави Монтеро
5
@ppumkin просто замените разделители «прямой косой черты», например ie: sed -i "s/../../g"на другой символ ie:, 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 / replace / flags'. Символы / могут быть заменены любым другим символом один символ в любой заданной s команде. "
Габриэль Стейплс