簡體   English   中英

是否可以在sed中使用匹配的字符串作為shell date命令的輸入?

[英]Is it possible to use the matched string in sed as an input to shell date command?

我有一個包含記錄的文件,其中包含GMT偏移的時間戳字段。 我想使用sed命令將記錄上的值替換為常規時間戳(沒有GMT偏移量)。

例如:

`$date -d '2012/11/01 00:50:22 -0800' '+%Y-%m-%d %H:%M:%S'`

返回此值,這是我想要做的:

2012-11-01 01:50:22

除非我想在此文件的每一行上執行該操作,並將date命令應用於timestamp值。 這是一個示例記錄:

"SB","6GV96644X48128125","","","","T0006",2012/10/03 13:08:43 -0700,"NJ"

這是我的代碼:

head -1 myfile | sed 's/,[0-9: /\-]\{25\},/,'"`date -d \1 '+%Y-%m-%d %H:%M:%S'`"',/

這不起作用:它只是忽略\\ 1並用今天的日期替換匹配的模式:

"SB","6GV96644X48128125","","","","T0006",2012-11-14 01:00:00,"NJ"

我希望\\1會導致匹配的模式傳遞給date函數並返回一個常規時間戳值(如上面提供的示例,顯示日期函數如何應用GMT偏移量並返回常規stimestamp字符串)並將替換記錄中的舊值。

我會用awk代替。 例如:

awk '{cmd="date -d \""$7"\" \"+%Y-%m-%d %H:%M:%S\"";
    cmd | getline k; $7=k; print}' FS=, OFS=, myFile

這將使用在第7個字段的原始內容上運行date命令的結果替換第7個字段。

sed

head -1 datefile |
  sed '
    # handle % in input correctly
    s/%/%%/g
    # execute date(1) command
    s/\(.*,\)\([0-9: /\-]\{25\}\)\(,.*\)/'"date -d '\2' '+\1%Y-%m-%d %H:%M:%S\3'"'/e'
  '

這可能適合你(GNU sed):

sed -r 's/^(([^,]*,){6})([^,]*)(.*)/printf "%s%s%s" '\''\1'\'' $(date -d '\''\3'\'' '\''+%Y-%m-%d %H:%M:%S'\'') '\''\4'\''/e;q' file

采用

head -1 datefile | sed -e 's?\(..\)/\(..\)/\(.... ..:..:..\)?'"date -d '\2/\1/\3' '+%s'"'?e'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM