Я хочу заменить многострочную строку в уценке другой (также многострочной). Я думаю, Perl - лучший вариант.

Например, я хочу заменить

## Exercise 1 
some text
some more text

## Points

от

## Exercise 1 
some new text
some more different text

## Points

Вот что у меня есть:

FIND=(##\ Exercise\ 1).*(##\ Points)
REPLACE=`cat schema.md`
perl -i -pe 'BEGIN{undef $/;} s/$FIND/$REPLACE/smg' P.md

Спасибо за любую помощь!

1 ответ1

0

Вы должны использовать правильные цитаты. Скобки имеют особое значение во многих оболочках, а переменные оболочки не будут работать внутри одинарных кавычек. Кроме того , если ваша замена содержит , например, / или $ синтаксис Perl будет неправильно и замена будет выполнена.

Вы можете использовать следующий скрипт:

perl -i -pe 'BEGIN { undef $/; } s/^## Exercise 1.*^## Points.*?^/`cat schema.md`/sme' P.md

Пояснения:

  • BEGIN { undef $/; } заставляет Perl читать весь файл за один раз.
  • s/A/B/sme находит A в нескольких строках, обрабатывает обратные ссылки в B, оценивает новый B и использует результат в качестве замены.
  • ^## Exercise 1.*^## Points.*?^ будет соответствовать диапазону от строки, начинающейся с ## Exercise 1 до строки, начинающейся с ## Points а затем до начала следующей строки.
  • `cat schema.md` означает, что когда совпадение найдено, Perl выполнит cat schema.md в качестве команды оболочки. Таким образом, новый текст будет содержимым schema.md.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .