我有一個形式的表達式@(<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
修飾符總是將整個模式空間傳遞給 shell - 並且該 shell 總是/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
修飾符似乎不會從 shell 命令的輸出中刪除尾隨換行符號 - 因此是chomp
)。
但是,如果您打算使用,perl
最好使用可用模組之一來進行日期操作 - 例如
$ 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"