sed コマンド regexp group を使用してグループから $() 部分にデータを渡す方法

sed コマンド regexp group を使用してグループから $() 部分にデータを渡す方法

sedコマンドを使用してmail.logの日付をタイムスタンプ形式に変更したいと思います。 $()内でグループから日付コマンドに\ 1を渡すのに問題がありますか?

sed -E "s/(^.{15})/$(date -d "\1" "+%s")/" /var/log/mail.log

答え1

引用と拡張に関する講義です:-)

"s/(^.{15})/$(date -d "\1" "+%s")/"

したがって、引数は以下を連結したものです。

  • 's/(^.{15})/$(date -d '、そのまま配信
  • \1、シェルによって解釈される
  • ""(単一スペース)はそのまま渡されます。
  • +%sシェルとして解釈される
  • )/これは現状のまま渡されます。

あなたが望むもの:

s/(^.{15})/$(date -d "\1" "+%s")/

日付部分はシェルによって拡張されます。

これを達成する方法は2つあります。創造的な引用:

"s/(^.{15})/$(date -d '\1' '+%s')/"

またはフェンス:

"s/(^.{15})/$(date -d \"\1\" \"+%s\")/"

dateただし、これはファイルの各行ではなくコマンドライン拡張で実行されるため、まだ機能しません。だからそれをdate見るだけでも\1日付が有効ではないと文句を言います。一度だけ:最初は、すべての行に適用されるわけではありません。

したがって、perlorbashより良い選択ですsed

答え2

as修飾子をGNU sed使用してsedコマンドを呼び出すとします。入力データを共有していないので、おそらく15文字より長いと仮定します。/es///

sed -E 's/^(.{15})(.*)/echo "$(date -d "\1" "+%s")\2"/e' /var/log/mail.log

関連情報