変換しようとしています。
<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
答え1
たとえば、次のようにグループを使用できます。
$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml
おそらくREで最も混乱しているのは、いくつかの構文スタイルで提供されることです。
たとえば、sedとvimを使用すると、基本正規表現()
メタセマンティクスを得るには引用する必要があります。
そして拡張正規表現()
(例:awk、egrepなど)文字通りの意味を得るには引用する必要があります。他のメタ文字にも同様の違いがあります。
BREセマンティクスの根拠は、ほとんど()
の入力がCコードの場合、メタ使用時に括弧を引用する方がより実用的であることです。
答え2
使用xmlstarlet
:
name
値を持つすべてのノードとノードにid
属性を追加するか、必要に応じて追加します。Name
id
Name
- すべて
name
とid
ノードの名前をに変更しますcolumn
。
xmlstarlet ed \
-s '//id' -t attr -n name -v id \
-s '//Name' -t attr -n name -v Name \
-r '//id' -v column \
-r '//Name' -v column file.xml
次のようなサンプル文書が与えられた場合
<root>
<id>1</id><Name>ENTERPRISE RESOURCE PLANNING</Name>
<id>2</id><Name>ENTERPRISE RESOURCE PLANNING (the return)</Name>
</root>
(ノード間のスペースは重要ではありません。)結果は次のとおりです。
<?xml version="1.0"?>
<root>
<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>
<column name="id">2</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING (the return)</column>
</root>