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