用正向查找替换 XML 实体值

用正向查找替换 XML 实体值

我正在尝试sed对文件做一些非常简单的操作:

sed 's:(?<=<Type>)default(?=</Type>):super:' < myfile.xml

这个概念非常简单,使用积极的环视,找到标签并将内容替换为“super”。不幸的是,它不起作用,没有任何东西被替换。我究竟做错了什么?

我正在寻找“编辑”与此类似的文件:

<Hello>
    <World>
        <Type>default</Type>
    </World>
</Hello>

使其看起来像这样:

<Hello>
    <World>
        <Type>super</Type>
    </World>
</Hello>

答案1

您的正则表达式是正确的,但sed不处理环视。您的代码可以很好地使用perl

perl -pe 's:(?<=<Type>)default(?=</Type>):super:' your.file

由于正则表达式通常不太适合 XML 处理,因此我建议尝试一下XML小星:

xml ed -O -u '//Type' -v 'super' your.file

perl和都xml可以进行就地编辑,因此无需更换sed.

答案2

您正在尝试在 sed 中使用 Perl 正则表达式语法;这是行不通的。 Sed 用途基本正则表达式; Perl 使用扩展正则表达式更多功能。 Lookaround 是 Perl 特有的功能之一;它可以在其他现代正则表达式实现中找到,但不能在 sed 中找到。

你不需要在这里四处张望。您要替换的模式的开头或结尾处的正向环视可以轻松地转换为变量替换文本。也可以看看仅返回匹配模式之后的行部分以获得更多示例和解释。

sed 's:\(<Type>\)default\(</Type>\):\1super\2:'

在这里,由于后向查找和前向查找是恒定的,您甚至可以进行简单的字符串替换。

sed 's:<Type>default</Type>:<Type>super</Type>:'

答案3

我不太清楚输入的哪些部分是可变的,哪些是恒定的。假设Type是变量并且default,super是常量,您可以使用以下sed脚本

s:<\([^>]\+\)>default</\1>:<\1>super</\1>:

相关内容