清除两个特定行之间的文本并在 Bash 中添加新值

清除两个特定行之间的文本并在 Bash 中添加新值

我自己正在写剧本。但我需要你的帮助

我有一个如下文件(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 版本之间有所不同)。

但我也可以建议更改SEPERATORSEPARATOR- 如果其他具有更多“传统”拼写方法的人稍后必须维护您的代码,甚至可能是您的旧版本,类似的事情可能会非常烦人。

答案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方法,但在其他方面非常相似。每种方法都给出相同的输出。

https://raku.org

相关内容