我有文字
7304628626|duluth/superior|18490|2016|volvo|gas|49230|automatic|sedan|white|mn|46.815216|-92.178109|2021-04-10T08:46:33-0500
我想將文本更改2021-04-10T08:46:33-0500為10/04/2021 08:46:33
我嘗試使用此命令
sed -n "s/|\([0-2][0-9][0-9][0-9]\)-\([0-1][0-9]\)-\([1-3][0-9]\)\(T\)\([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\)\(-[0-1][0-9][0][0]\)/|\3\/\2\/\1 \5 /p" filename
但有些文字沒有改變
uj5u.com熱心網友回復:
使用 sed
$ sed 's/\(.*|\)\([^-]*\)-\([^-]*\)-\([^T]*\)T\([^-]*\).*/\1\4\/\3\/\2 \5/' input_file
7304628626|duluth/superior|18490|2016|volvo|gas|49230|automatic|sedan|white|mn|46.815216|-92.178109|10/04/2021 08:46:33
\(.*|\)- 匹配直到最后一次出現|管道符號
\([^-]*\)- 匹配直到下一次出現-斜線。Stores 2021and 04which can return with \2and \3back reference
\([^T]*\)- 匹配到下一次出現的T資本 T. Stores10可以回傳\4參考
T - 排除 T
\([^-]*\)- 匹配直到下一次出現 - 斜線。08:46:33可以通過\5反向參考回傳的商店
.* - 排除其他一切
如果您的意圖是僅回傳日期和時間,則可以洗掉第一個反向參考
$ sed 's/\(.*|\)\([^-]*\)-\([^-]*\)-\([^T]*\)T\([^-]*\).*/\4\/\3\/\2 \5/' input_file
10/04/2021 08:46:33
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下sed程式。
sed -E 's/(.*\\|)([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}:[0-9]{2}:[0-9]{2})-.*/\1\4\/\3\/\2 \5/' Input_file
說明:sed在這里使用程式的反向參考功能將匹配的值存盤到臨時緩沖區中,并在以后在替換中使用它們。在主程式中sed使用-E選項啟用 ERE(擴展正則運算式)然后使用s選項執行替換。首先創建 5 個要匹配的捕獲組7304628626|duluth/superior|18490|2016|volvo|gas|49230|automatic|sedan|white|mn|46.815216|-92.178109|(在第一個捕獲組中)、2021(在第二個捕獲組中)、04(在第三個捕獲組中)、10(在第 4 個中)和 08:46:33(在第 5 個捕獲組中)。并且在根據 OP 需要的順序替換它們以保持捕獲組的同時,因為 OP 希望2021-04-10T08:46:33-0500更改為10/04/2021 08:46:33.
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E 's#\|(....)-(..)-(..)T(..:..:..)-....$#|\3/\2/\1 \4#' file
模式匹配并根據需要使用反向參考格式。
注意 使用|和$將模式錨定到行上的最后一個欄位以及破折號、冒號和大寫字母 T 的性質使其最不可能匹配任何其他字串,因此可以使用點來匹配數字,但如果你喜歡更換.的通過[0-9]的。也#用作/替換命令中正常的替代分隔符,s#...#...#如/替換字串中出現的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357972.html
