用 sed 替换文本并保留原始文本的一部分

Mik*_*ike 22 xml sed regular-expression

我正在尝试转换

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>
Run Code Online (Sandbox Code Playgroud)

到:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>
Run Code Online (Sandbox Code Playgroud)

我假设这项工作的最佳工具是sed,但是我无法弄清楚如何将原始文本的一部分保留在替换部分中。

如果我做:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml
Run Code Online (Sandbox Code Playgroud)

输出是:

<column name="\1">\2</column>
<column name="\1">\2</column>
Run Code Online (Sandbox Code Playgroud)

或者从 inside 做类似的事情vi,它输出:

<column name=""></column>
<column name=""></column>
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点,\1并被\2替换回它们的原始值?

max*_*zig 24

您可以使用组,例如:

$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml
Run Code Online (Sandbox Code Playgroud)

可能关于 RE 最令人困惑的部分是有各种不同的句法风格。

例如 sed 和 vim 使用基本的正则表达式,您必须在其中引用()才能获得它们的元含义。

对于扩展的正则表达式(例如 awk、egrep 和 less),您必须引用()以获得字面含义。其他元字符也有类似的差异。

BRE()语义背后的基本原理是,当您的大部分输入是 C 代码时,为了元使用而必须引用括号更为实际。