在所有文件中递归替换所有<h2>标记</h2> <h1>的Perl脚本</h1>

时间:2012-03-12 11:42:28

标签: regex linux perl

这样的事情

<h2 style='margin-top: 10px;'>
<?php echo $title; ?>
</h2>

应该成为

<h1 style='margin-top: 10px;'>
<?php echo $title; ?>
</h1>

我使用此代码perl -pi -e 's/<h2(.*)<\/h2>/<h1\1<\/h1>/g' *但仅当代码位于一行时才有效。

5 个答案:

答案 0 :(得分:4)

无需配对开始和结束标签。只需将所有打开的<h2>标记更改为“`,然后对所有结束标记执行相同操作。喜欢这个

perl -pie 's|<h2\b|<h1|g; s|</h2\b|</h1|g;' *

答案 1 :(得分:2)

perl -pi.bak -we 's#</?h\K2#1#g' yourfile

\K会在其前面保留匹配的文字。这样我们就不必在匹配后把它放回去了。

答案 2 :(得分:1)

没有* nix环境要测试,但是

% find . -name "*.html" -exec sed -e s/\<h2/\<h1/g -e 's|</h2|</h1|g' {} \;

可能会让你开始。不需要Perl。

答案 3 :(得分:0)

您可以像这样使用perl:

perl -0pe -i.bak 's#<h2(.*?)</h2>#<h1$1</h1>#gs' file

答案 4 :(得分:0)

下面的代码适用于我

use strict;
use warnings;

open FILE, 'inputfile.txt';

my $contents = do { local $/; <FILE> };

close FILE;

$contents =~ s/<h2(.*?)<\/h2>/<h1$1<\/h1>/sg;

print $contents;

请注意,$/是输入记录分隔符。默认为新行\n
我们创建$/的本地化版本,以便在块完成后恢复其先前的值。