ファイル内の行を見つけてタグに含まれるデータのクリーンアップ

ファイル内の行を見つけてタグに含まれるデータのクリーンアップ

以下のファイルを整理(所定の場所で編集)しようとしています。

<id>474488</id>
<name>Shawn</name>
<nr>143385</nr>

<id>474490</id>
<name>Bob</name>
<nr>.27. 43-88</nr> # this is the line of interest

<id>474568</id>
<name>Jim</name>
<nr>
</nr> # sometimes there will be no value and a closing tag on a newline, this can be ignored
....

希望の出力:

<id>474488</id>
<name>Shawn</name>
<nr>143385</nr>

<id>474490</id>
<name>Bob</name>
<nr>274388</nr> # note that nr data has been cleaned to digits only

<id>474568</id>
<name>Jim</name>
<nr>
</nr>
....

つまり、<nr> </nr>ラベルに含まれるデータから数字以外の文字をすべて削除したり、特定の文字を削除したいとします。

私のコード:

sed -Ee  '/<nr>/ s/>(.*)</>\1</g' test1.txt

これがすること:

  • <nr>次の行のみを選択してください。

  • その中のラベルとコンテンツを置き換えます(グループ1のコンテンツキャプチャ=グループ1のコンテンツキャプチャで何をすべきかわからないため、変更はありません)。

また、理想的には を交換したくはありませんが、sed から sed 以降および以前に> <開始するよう指示するのは sed では不可能に見えます。><

何を追加する必要があります(しかし方法がわかりません):

挿入する前に、キャプチャグループ1の内容をフィルタリングします(削除.- 数字のみを許可)。whitespace

どうすればいいですか?

他のツールを使用する必要がありますか?

ベストアンサー1

これはXMLフラグメントのように見えます。<root/>次のXMLを持つように閉じる要素を追加してから、XML編集ツールを使用できます。

xmlstarlet ed -u '//nr' -x 'translate(text(), "- .", "")' file.xml
<?xml version="1.0"?>
<root>
  <id>474488</id>
  <name>Shawn</name>
  <nr>143385</nr>
  <id>474490</id>
  <name>Bob</name>
  <nr>274388</nr>
  <id>474568</id>
  <name>Jim</name>
  <nr>
</nr>
</root>

ここで重要な部分はXPath translate()機能です。ある文字列の文字を別の文字列の文字に置き換えるという点で、UNIX / Linuxコマンドと同様に機能しますtr(最初のパラメータは計算する値です)。

私はそれをnr作業のためのフックとして使用します。必要に応じて要素パスがより正確になることがあります(私の例でも/root/nr機能します)。

実際にファイルを処理するフィルタリングツールはほとんどありません。一時ファイルを作成し、それを使用して元のファイルを置き換えます。この場合は、直接実装する必要があります。

xmlstarlet ... file.xml >file.xml.tmp && mv -f file.xml.tmp file.xml

おすすめ記事