@(<date calculation>)
の結果に置き換えたい形式の式がありますdate +%s --date "now<date calculation>"
。たとえば、@(-1 day)
は の結果に置き換えられますdate +%s --date "now -1 day"
。
式はテキスト行に埋め込まれており、複数行にすることができます。たとえば、 ですecho hi @(-1 day) bye "@(-1 hour)"
。評価の結果は のようになりますecho hi 1491848561 bye "1491931365"
。したがって、式だけを評価し、それ以外は何も評価しないようにします。
GNU の sed 'e' コマンドを使用しようとしましたsed -r 's|@\(([^)]*)\)|date +%s --date "now\1"|e'
が、これは置換された式だけでなく、行全体を評価します。
私はsedの使用にこだわっていないので、他の提案は歓迎しますが、一般的な知識として、sedを機能させる方法について興味があります。
答え1
私の知る限り、GNU sede
修飾子は常にパターン空間全体をシェルに渡します。そしてそのシェルは常に/bin/sh
perl
次のような方法を使うともっとうまくいくかもしれません。
$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' |
perl -pe 's/@\((.*?)\)/sprintf "%s", $d = `date +%s --date "now $1"`, chomp $d/ge'
For example echo hi 1491874845 bye "1491957645"
( とは異なりsed
、perl
e
修飾子はシェル コマンドの出力から末尾の改行を削除しないようです。そのためchomp
)。
ただし、これを使用する場合は、perl
日付操作を行うために利用可能なモジュールの1つを使用することをお勧めします。たとえば、
$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' |
perl -MDate::Manip=ParseDateDelta,UnixDate -pe 's/@\((.*?)\)/UnixDate(ParseDateDelta($1), "%s")/ge'
For example echo hi 1491875065 bye "1491957865"