Я использую OSX, и у меня возникла проблема при попытке заменить строку в файле с помощью команды sed. Проблема в том, что строка замены содержит квадратную скобку. В частности, я хочу заменить эту строку "сообщение--------------" (- пробелы)
на это "сообщение------[да]"
но если я наберу
sed "message /s//message \ [ yea ]" filein > fileout
Я получаю это сообщение: неверный флаг в команде замены: '['
Я пытался поставить \ перед [, но это не сработало. Кто-нибудь может помочь? Спасибо!
Ответ 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-команда неизвестна. Еще один ключ к успеху - маскировать одиночный символ [ сразу, без пробела между ними, обратной косой чертой. Однако в правой части выражения-подстановки группа не имеет особого смысла, поэтому вам не нужно их маскировать.