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

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

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

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

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

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


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


Ответы (2)


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

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

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

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

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

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

person Michael J. Barber    schedule 12.10.2011
comment
Спасибо! Собственно это был второй случай, пробелы пришлось заменить. В любом случае это сработало. Но теперь у меня другая проблема... Я должен заменить последние 9 пробелов в строке на / [yea] на косую черту! Любые идеи? - person user991269; 12.10.2011
comment
Я расширил объяснение, которое, надеюсь, позволит вам лучше обобщить команду. Для вашей модификации вам просто нужно расширить строку пробелов до 9 и текст замены до \\ [ yea ]. - person Michael J. Barber; 12.10.2011
comment
Кстати, пара советов, так как вы новый пользователь. В Stack Overflow можно поблагодарить, проголосовав и/или приняв ответы. Точно так же лучше изменить или уточнить вопрос, отредактировав вопрос, а не в комментариях. Но не переусердствуйте с изменениями вопроса: Stack Overflow — это сайт вопросов и ответов, а не форум. - person Michael J. Barber; 12.10.2011

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

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

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

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

person user unknown    schedule 12.10.2011
comment
В тексте. Проверьте сделанное мной редактирование, чтобы убедиться, что оно соответствует вашим намерениям. Извините, если я был неясен. - person Michael J. Barber; 12.10.2011
comment
Да я вижу. Если вы видите опечатку, вы можете ее исправить, если неясно, сделано ли это намеренно. Я удалю свой первый комментарий как «дискуссионный шум». - person user unknown; 12.10.2011