Использование sed с regex для замены текста в OSX и Linux
Я пытаюсь заменить некоторые строки внутри файла sed
используя регулярные выражения. Чтобы усложнить ситуацию, это делается внутри скрипта Makefile, который должен работать на обоих osx
а также linux
,
В частности, в пределах file.tex
Я хочу заменить
\subimport{chapters/}{xxx}
с
\subimport{chapters/}{xxx-yyy}
(xxx
а также yyy
просто пример текста.)
Заметка, xxx
может содержать любые буквы, цифры и _
(подчеркивание), но на самом деле регулярное выражение может просто соответствовать чему-либо в скобках. Иногда в начале строки перед пробелом \subimport...
,
Дизайн искомой строки требует много экранирования (при поиске с помощью регулярных выражений), и я предполагаю, что где-то там лежит моя ошибка.
Вот что я пробовал до сих пор:
sed -i'.bak' -e 's/\\subimport\{chapters\/\}\{xxx\}/\\subimport\{chapters\/\}\{xxx-yyy\}/g' file.tex
# the -i'.bak' is required so SED works on OSX and Linux
rm -f file.tex.bak # because of this, we have to delete the .bak files after
Это приводит к ошибке RE error: invalid repetition count(s)
когда я создаю свой Makefile, который содержит этот скрипт.
Я думал, что частью моей проблемы было то, что -E
вариант для sed
не был доступен в osx
версия sed
, Оказывается, при использовании -E
вариант, нужно избегать меньшего количества вещей (см. комментарии к моему вопросу).
2 ответа
Вот версия, которая сработала для меня.
sed -i.bak -E 's#^([[:blank:]]*\\subimport{chapters/}{[[:alnum:]_]+)}$#\1-yyy}#' file.tex
rm -f file.tex.bak
Большое спасибо @heemayl. Их ответ лучше написан, просто потребовалась некоторая настройка, чтобы получить версию, которая работала на меня.
POSIX-лы:
sed 's#^\(\\subimport{chapters/}{[[:alnum:]_]\+\)}$#\1-yyy}#'
#
используется в качестве разделителя параметров дляsed
"ss
(Замена)\(\\subimport{chapters/}{[[:alnum:]_]\+\)
это захваченная группа, содержащая все необходимое до последнего}
перед одной или несколькими алфавитами, цифрами и подчеркиваниемПри замене, первая захваченная группа сопровождается необходимой строкой, закрытой
}
Пример:
$ sed 's#^\(\\subimport{chapters/}{[[:alnum:]_]\+\)}$#\1-yyy}#' <<<'\subimport{chapters/}{foobar9}'
\subimport{chapters/}{foobar9-yyy}
$ sed 's#^\(\\subimport{chapters/}{[[:alnum:]_]\+\)}$#\1-yyy}#' <<<'\subimport{chapters/}{spamegg923}'
\subimport{chapters/}{spamegg923-yyy}