テキストを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元の値に戻って置換されていますか?

回答:


21

次のようなグループを使用できます。

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

おそらくREで最も混乱している部分は、さまざまな構文フレーバーがあることです。

たとえば、sedとvimは、メタ意味を取得するために引用する必要がある基本的な正規表現を使用します()

拡張正規表現(例えばAWK、egrepの少ない)あなたは、引用する必要が()文字通りの意味を取得します。他のメタキャラクターにも同様の違いがあります。

BRE ()セマンティクスの背後にある理論的根拠は、入力の大部分がCコードである場合、メタ使用のために括弧を引用する必要がある方がより実用的であるということです。


これは実際に私が最初に試したものでしたが、()文字をエスケープしませんでした。愚かな質問ですが、なぜそれが必要なのですか?
マイク

1
@マイク、良い質問-答えを更新しました。
マックスシュレプツィヒ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.