評估文字行的一部分

評估文字行的一部分

我有一個形式的表達式@(<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"

(與 不同的是sedperl 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"

相關內容