Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Справка SED: как заменить строку на другую, содержащую квадратные скобки

Автор вопроса: user991269Ответов: 2

Я использую OSX, и у меня возникла проблема при попытке заменить строку в файле с помощью команды sed. Проблема в том, что строка замены содержит квадратную скобку. В частности, я хочу заменить эту строку "сообщение--------------" (- пробелы)
на это "сообщение------[да]"

но если я наберу

sed "message              /s//message     \ [ yea ]" filein > fileout

Я получаю это сообщение: неверный флаг в команде замены: '['

Я пытался поставить \ перед [, но это не сработало. Кто-нибудь может помочь? Спасибо!

  • Ваша команда sed сформирована неправильно, но я получаю другое сообщение об ошибке, недопустимый код команды m. Michael J. Barber 12.10.2011

replacesed

Ответы

Ответ 1 · рейтинг 1 · Michael J. Barber

Попробуй это:

sed 's/message    /&[ yea ]/g' filein > fileout

& соответствует выражению. Никакой специальной обработки брекеты не требуют.

Мне было не совсем понятно, как должны обрабатываться пробелы. Приведенное выше просто добавляет [ yea ] в конец последовательности пробелов фиксированной длины. Если предпочтительнее заменить последние пробелы в последовательности пробелов произвольной длины на [ yea ], потребуется более сложная команда:

sed 's/\(message \{1,\}\)       /\1[ yea ]/g' filein > fileout

Идея в этом случае состоит в том, чтобы сопоставить образец, который состоит из двух частей. Сначала идет группа, заключенная в скобки \( \), которая ищет message, за которым следует один или несколько пробелов (\{1,\}. За ним должно следовать ровно семь пробелов. Когда найден соответствующий текст, он заменяется текстом группы (\1 , обозначая первую группу), за которой следует [ yea ]. Стратегия здесь может быть адаптирована к другим шаблонам поиска-замены, например, с несколькими группами или другим текстом.

Ответ 2 · user unknown

Точно не считая пробелов:

echo "message         foo" | sed "s/message        /message [ yea ]/"

сообщение [ да ] foo

Командой-заменителем является 's/IN/OUT/', в то время как 'm...' неизвестна - m-команда неизвестна. Еще один ключ к успеху - маскировать одиночный символ [ сразу, без пробела между ними, обратной косой чертой. Однако в правой части выражения-подстановки группа не имеет особого смысла, поэтому вам не нужно их маскировать.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы