Использование 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"s s (Замена)

  • \(\\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}
Другие вопросы по тегам