テキスト行の一部を評価する

テキスト行の一部を評価する

@(<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"

( とは異なりsedperl 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"

関連情報