テキストをsedに置き換え、元のテキストの一部を保持します。

テキストを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

答え1

たとえば、次のようにグループを使用できます。

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

おそらくREで最も混乱しているのは、いくつかの構文スタイルで提供されることです。

たとえば、sedとvimを使用すると、基本正規表現()メタセマンティクスを得るには引用する必要があります。

そして拡張正規表現()(例:awk、egrepなど)文字通りの意味を得るには引用する必要があります。他のメタ文字にも同様の違いがあります。

BREセマンティクスの根拠は、ほとんど()の入力がCコードの場合、メタ使用時に括弧を引用する方がより実用的であることです。

答え2

使用xmlstarlet:

  1. name値を持つすべてのノードとノードにid属性を追加するか、必要に応じて追加します。NameidName
  2. すべてnameidノードの名前をに変更します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>

関連情報