多行字符串替换漂亮的缩进(Multiline string replace with pretty

2019-10-20 19:23发布

我想做一些模板文件的多行字符串替换,但保留一个漂亮的压痕。

这里是模板的一个例子:

<TAG1>
    <TAG2>
        %REPLACETHIS%
    </TAG2>
</TAG1>

现在,当我干脆用绳子像替换字符串%REPLACETHIS%

<REPLACEDSTRINGTAG1>
    replacedstringtext
</REPLACEDSTRINGTAG1>

它看起来是这样的:

    <TAG1>
        <TAG2>
            <REPLACEDSTRINGTAG1>
    replacedstringtext
</REPLACEDSTRINGTAG1>
        </TAG2>
    </TAG1>

当它应该是这样的:

    <TAG1>
        <TAG2>
            <REPLACEDSTRINGTAG1>
                replacedstringtext
            </REPLACEDSTRINGTAG1>
        </TAG2>
    </TAG1>

它会变得更加复杂,因为模板将是一个更大的模板,它应该被正确地缩进以及一部分。

我想在Perl来实现这一点,但基本上问题是在我认识的语言相同。

有没有人一个更好的主意,而不是只需更换行由行与跟踪当前的缩进深度的变量? 这是非常麻烦的,由于多层次的模板结构。

基本上,我需要的是一个简单的正则表达式,将不仅把替换字符串的第一行,在右边栏的替代品,而是把每行该列。 所以,如果%REPLACETHIS%是在第10栏,替换字符串中的所有行应在山坳10把......也许有一些棘手的内置魔术在Perl的正则表达式?

Answer 1:

现在,您的模板文件是XML格式的,你可以使用一些XML处理模块来处理它。 它更灵活,可靠。

对于你的情况, XML ::的libxml可以完美处理:

use XML::LibXML;
use XML::LibXML::PrettyPrint;

my $xml = "template.xml";
my $parser = XML::LibXML->new();
my $tree = $parser->parse_file($xml);
my $root = $tree->getDocumentElement;

my ($replace_node) = $root->findnodes('/TAG1/TAG2');
$replace_node->removeChildNodes();
my $new_node = $tree->createElement('REPLACEDSTRINGTAG1');
$new_node->appendText('replacedstringtext');
$replace_node->addChild($new_node);

my $pp = XML::LibXML::PrettyPrint->new(indent_string => "\t");
$pp->pretty_print($tree);
print $tree->toString;


Answer 2:

不相信正则表达式是这样做的正确的做法,但如果你用一组拍摄前的压痕%REPLACETHIS%您只需输入其放回subsitution。

s/(.*)%REPLACTHIS%/$1<REPLACEDSTRINGTAG1>\n$1    replacedstringtext\n$1</REPLACEDSTRINGTAG1>

DEMO



文章来源: Multiline string replace with pretty indentation