Замените многострочную строку другой многострочной строкой в файле уценки в OS X
Я хочу заменить многострочную строку в уценке другой (также многострочной). Я думаю, 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 ответ
Решение
Вам нужно использовать правильные цитаты. Скобки имеют особое значение во многих оболочках, а переменные оболочки не будут работать внутри одинарных кавычек. Кроме того, если ваша замена содержит такие как /
или же $
, синтаксис 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.