sedの\ 1(またはawkの$ 1)をどのように機能しますか?

sedの\ 1(またはawkの$ 1)をどのように機能しますか?

複数行を含むファイルがあります。それぞれにタイムスタンプとテキストがあります。

1534888050 some text
1534888051 some more text
1534888052 text

...テキストを保存しながらタイムスタンプを読みやすい形式に変換しようとしています。結果は次のとおりです。

Tue Aug 21 21:47:30 UTC 2018 some text
Tue Aug 21 21:47:31 UTC 2018 some more text
Tue Aug 21 21:47:32 UTC 2018 text

date -d@"${somedate}"タイムスタンプ自体を正しく変換します。

それでは、フィルタ/パイプコマンドで同じ効果を得たいと思います。sedまたはアッ(または他の一般的なコマンド)。

これはうまくいきませんが、おおよそ私が考えるものを説明します。

echo '1534888050 some text' | sed "s#^\([0-9]*\) .*#`date -d@\1`#g"

(これは\1一致するタイムスタンプです)

これをエレガントに達成する方法はありますか?

ベストアンサー1

これ日付ツールソフトウェアパッケージは、この種の作業、特にdconvツールに適しています。 (Ubuntuシステムにインストールする場合は、このコマンドをとして使用できますdateutils.dconv。)

例は次のとおりです。

$ cat testfile.txt 
1534888050 some text
1534888051 some more text
1534888052 text
$ dateutils.dconv -i '%s' -f '%a %b %d %T %Y' -S <testfile.txt 
Tue Aug 21 21:47:30 2018 some text
Tue Aug 21 21:47:31 2018 some more text
Tue Aug 21 21:47:32 2018 text
$ dateutils.dconv -i '%s' -f '%F %T' -S <testfile.txt 
2018-08-21 21:47:30 some text
2018-08-21 21:47:31 some more text
2018-08-21 21:47:32 text
$ 

フラグは、-Sツールが「sed モード」で実行され、出力に日付ではなくテキストを含めるように指示する鍵です。

この-iフラグは入力日付形式を指定し、この-fフラグは出力日付形式を指定します。

おすすめ記事