テキスト行の一部の評価

テキスト行の一部の評価

フォームに式がありますが、@(<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"

関連情報