フォームに式がありますが、@(<date calculation>)
これを結果に変更したいと思いますdate +%s --date "now<date calculation>"
。たとえば、@(-1 day)
結果はに置き換えられますdate +%s --date "now -1 day"
。
式は1行のテキストに含まれており、複数の行を持つことができます。たとえば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"