同じフォルダ内の複数のテキストファイル(* .txt)の間に日付タイムスタンプを使用してXML文字列形式を変更します。

同じフォルダ内の複数のテキストファイル(* .txt)の間に日付タイムスタンプを使用してXML文字列形式を変更します。

次のように、XML形式の日付を含むテキストファイルがたくさんあります。

<DATA2020-04-13T08:59:05.427 />

次のように変更する必要があります。

<DATA>2020-04-13T08:59:05.427</DATA>

メモ:

日付と時刻は文字列ごとに異なり、変更できません。各行の前後にはXML形式のコンテンツが多く表示されます。また、Unixを使用するdateことはオプションではなく、実際にファイル内のXML文字列を変更する必要があります。

sed//検索と置換を使用しようとしていますawkperlおそらくワイルドカードを使用することもできます。誰でもこれを達成する方法を考えることができますか?

ベストアンサー1

$ echo '<DATA2020-04-13T08:59:05.427 />' | sed -E 's/<DATA(20[^/]*) \/>/<DATA>\1<\/DATA>/'
<DATA>2020-04-13T08:59:05.427</DATA>

または、エスケープをバックスラッシュする必要がないように、=区切り文字として代わりに使用してください。//

$ echo '<DATA2020-04-13T08:59:05.427 />' | sed -E 's=<DATA(202[^/]*) />=<DATA>\1</DATA>='
<DATA>2020-04-13T08:59:05.427</DATA>

これにより、読みやすくなります(もちろん、=検索パターンと代替テキストのすべての文字をエスケープする必要があります)。


Perlでもほぼ同じ正規表現を使用できます(主な違いは、\1Perlでキャプチャグループを参照する方が良いと正確です)。区切り演算子の$1より多くのオプションがあります(例:Match pair sum)。s{}

$ echo '<DATA2020-04-13T08:59:05.427 />' |
    perl -pe 's{<DATA(202[^/]*) />}                  
               {<DATA>$1</DATA>}'
<DATA>2020-04-13T08:59:05.427</DATA>

Perlには、角かっこ式と一緒に、または角括弧式内でエスケープされないスペース(改行を含む)を/x無視する修飾子があります。コメント\も無視します#。その目的は、コードでより読みやすく、文書化された正規表現を簡単に作成できるようにすることです。

man perlrePerl正規表現の詳細については、参考資料を参照してください。

おすすめ記事