我有每行包含看起來像這樣的多個部分JSON行:餵養通過命令sed的匹配塊
"SomeDate":"Date(-2156284800000)",
我想每次出現時轉換中的所有線路爲更人類可讀:
"SomeDate":"1901-09-03 00:19:32",
我試過使用sed把匹配的塊(在這種情況下是時間戳)放入日期命令的參數列表中。這失敗了。
$ echo '"SomeDate":"Date(-2156284800000)",' | \
sed "s/Date(\([0-9\-]*\)[0-9][0-9][0-9])/$(date [email protected]\\1 \"+%F %T\")/g"
date: invalid date `@\\1'
"SomeDate":"",
在試圖調試這一切我添加了一個「迴響」的日期,以驗證該命令應該運行
$ echo '"SomeDate":"Date(-2156284800000)",' | \
sed "s/Date(\([0-9\-]*\)[0-9][0-9][0-9])/$(echo date [email protected]\\1 \"+%F %T\")/g"
"SomeDate":"date [email protected] "+%F %T"",
$ date [email protected] "+%F %T"
1901-09-03-00:19:32
爲什麼無法按預期運行的第一個命令?
我現在最好的猜測是,subshell首先執行沒有\ 1替換,然後結果輸出實際上由sed使用。
我該如何實現我想要做的?
P.S.我使用CentOS的6.6
注意到你打開一個子shell執行的命令,所以大概值不「到」有。另外,要在'sed'中執行一個命令,你需要'/ e'。 – fedorqui
如果你用'-2156284800'代替'\\ 1',你會看到它的工作原理,顯示'\\ 1'與之前的字符串不匹配,原因在於@fedorqui描述的原因。 Fedorqui,你不需要'/ e',因爲這對我有用? –
我試過gnu sed的'e'選項。 回聲「bla foo bla foo」| sed -e「s @(foo)@echo XX \ 1XX @ e」 所需輸出:bla XXfooXX bla XXfooXX 實際輸出:sh:bla:找不到命令 –