Shell脚本:搜索并替换多行

我正在寻找一种通过Shell脚本搜索和替换多行的方法。这就是我想要做的:

source:

[stuff before]

<!--WIERD_SPECIAL_COMMENT_BEGIN-->

[stuff here, possibly multiple lines.

<!--WIERD_SPECIAL_COMMENT_END-->

[stuff after]

target:

[stuff before]

[new content]

[stuff after]

简而言之,我想删除注释及其之间的所有内容,并替换为一些新内容。基本上,我想在多行代码上执行一个简单的sed命令,并且如果可能的话,仅使用一些基本的*

nix工具,而无需其他脚本语言。

回答:

如果您只需要匹配完整的行,则可以使用来完成此任务 awk。就像是:

    awk -v NEWTEXT=foo 'BEGIN{n=0} /COMMENT_BEGIN/ {n=1} {if (n==0) {print $0}} /COMMENT_END/ {print NEWTEXT; n=0}' < myfile.txt

如果文件格式不正确,并且注释与要保留或删除的文本在同一行,那么我将使用perl,将整个文件读入单个字符串,进行正则表达式匹配并替换该字符串,然后将新字符串写入新文件。这不是那么简单,您需要编写perl脚本来完成工作。就像是:

#!/usr/bin/perl

$newtext = "foo\nbar";

$/ = ''; # no input separator so whole file is read.

$s = <>; # read whole file from stdin

$startPattern = quotemeta('<!--WIERD_SPECIAL_COMMENT_BEGIN-->');

$endPattern = quotemeta('<!--WIERD_SPECIAL_COMMENT_END-->');

$pattern = $startPattern . '.+' . $endPattern;

$s =~ s/$pattern/$newtext/sg;

print $s;

以上是 Shell脚本:搜索并替换多行 的全部内容, 来源链接: utcz.com/qa/431525.html

回到顶部