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


20

我正在尝试转换

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>

至:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>

我假设最好的工具是sed,但是我不知道如何将部分原始文本保留在替换部分中。

如果我做:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml

输出为:

<column name="\1">\2</column>
<column name="\1">\2</column>

或从内部执行类似操作vi,它输出:

<column name=""></column>
<column name=""></column>

我如何才能做到\1并被\2替换回其原始值?

Answers:


21

您可以使用组,例如:

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

关于RE的最令人困惑的部分可能是存在各种语法风格。

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

使用扩展的正则表达式(例如awk,egrep和less),必须引用()以获取字面意思。其他元字符也有类似的区别。

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


这实际上是我尝试的第一件事,但我并没有逃避(and )字符。愚蠢的问题,但这为什么有必要呢?
麦克

1
@Mike,好问题-更新了答案。
maxschlepzig 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.