在 OS X 上的 Markdown 文件中,用另一个多行字符串替换多行字符串

在 OS X 上的 Markdown 文件中,用另一个多行字符串替换多行字符串

我想用另一个字符串(也是多行)替换 markdown 中的多行字符串。我认为 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

您需要使用正确类型的引号。括号在许多 shell 中具有特殊含义,并且 shell 变量在单引号内不起作用。此外,如果您的替换包含诸如/或 之类的$内容,则 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作为 shell 命令执行。因此,新文本将成为 schema.md 的内容。

相关内容