我自己正在写剧本。但我需要你的帮助
我有一个如下文件(test.md):
sometext
sometext
<!--SEPERATOR1-->
text to be deleted
foobar to be deleted
foooooooooooobar
foobaaaaaaaaaaar
<!--SEPERATOR1-->
sometext
sometext
我想清理此文本文件(test.md)中由“SEPERATOR1”分隔的部分中的文本并添加新文本。我该如何做到这一点,谢谢。
预期输出:
sometext
sometext
<!--SEPERATOR1-->
new text
butterfly
foo bar etc.
<!--SEPERATOR1-->
sometext
sometext
答案1
您可以使用以下命令sed
指定范围来更改文本:/startpattern/,/endpattern/
c
sed '/<!--SEPERATOR1-->/,/<!--SEPERATOR1-->/c<!--SEPERATOR1-->\nnew text\nbutterfly\nfoo bar etc.\n<!--SEPERATOR1-->' filename.txt
用于\n
结果中的换行符。
您可以> newfilename.txt
在末尾添加以将输出重定向到文件,或者添加标志-i
以就地更改文件(尽管确切的语法sed 版本之间有所不同)。
但我也可以建议更改SEPERATOR
为SEPARATOR
- 如果其他具有更多“传统”拼写方法的人稍后必须维护您的代码,甚至可能是您的旧版本,类似的事情可能会非常烦人。
答案2
使用乐(以前称为 Perl_6)
~$ raku -e 'for lines.join("\n") {.subst(:global, / "<!--SEPARATOR1-->" <(.*?)> "<!--SEPARATOR1-->" /, "\nnew text\nbutterfly\nfoo bar etc.\n" ).put};' file.txt
#OR
~$ raku -e 'for lines.join("\n") {.split(/ <?after "<\!--SEPARATOR1-->"> .*? <?before "<\!--SEPARATOR1-->"> /).join("\nnew text\nbutterfly\nfoo bar etc.\n" ).put};' file.txt
输入示例:
sometext
sometext
<!--SEPARATOR1-->
text to be deleted
foobar to be deleted
foooooooooooobar
foobaaaaaaaaaaar
<!--SEPARATOR1-->
sometext
sometext
示例输出:
sometext
sometext
<!--SEPARATOR1-->
new text
butterfly
foo bar etc.
<!--SEPARATOR1-->
sometext
sometext
上面的代码是使用 Raku(Perl 编程语言家族的成员)的相当传统的方法。简而言之(第一个示例),lines
读入,join
用\n
换行符编辑,并SEPARATOR
搜索模式(配对),并.*?
与之间的零个或多个字符进行非贪婪匹配。如果找到<(
…)>
捕获标记,则将匹配项放在 之外<(.*?)>
,该匹配项将被所需的行替换。
第二个示例使用split
/join
方法,但在其他方面非常相似。每种方法都给出相同的输出。