web-dev-qa-db-ja.com

テキストをsedで置き換え、元のテキストの一部を保持する

変換しようとしています

<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
Mike

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

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

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

たとえば、sedとvimは基本正規表現を使用します。ここで、()を引用して、それらのメタ意味を取得する必要があります。

拡張正規表現(例:awk、egrepなど)では、文字どおりの意味を取得するには()を引用符で囲む必要があります。他のメタキャラクターについても同様の違いがあります。

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

22
maxschlepzig