次のように、XML形式の日付を含むテキストファイルがたくさんあります。
<DATA2020-04-13T08:59:05.427 />
次のように変更する必要があります。
<DATA>2020-04-13T08:59:05.427</DATA>
メモ:
日付と時刻は文字列ごとに異なり、変更できません。各行の前後にはXML形式のコンテンツが多く表示されます。また、Unixを使用するdate
ことはオプションではなく、実際にファイル内のXML文字列を変更する必要があります。
sed
//検索と置換を使用しようとしていますawk
。perl
おそらくワイルドカードを使用することもできます。誰でもこれを達成する方法を考えることができますか?
ベストアンサー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でもほぼ同じ正規表現を使用できます(主な違いは、\1
Perlでキャプチャグループを参照する方が良いと正確です)。区切り演算子の$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 perlre
Perl正規表現の詳細については、参考資料を参照してください。