2014-06-10 48 views
0

我有一個文件:START.txt用線,如:時間戳 - 正則表達式從一種格式更改爲另一個

13.03.2013 12:13:42|STRING1|NUMBER1|NUMBER2|NUMBER3 

,我想改變,從這個文件中的所有行的格式如下:

12:13|STRING1|NUMBER1|NUMBER2|NUMBER3 

這怎麼辦?

+0

「這怎麼辦?」,你問。通過解析輸入,丟掉位你不想要,並保持你想要的位。可能用'awk'。或'python'或'perl'。或者甚至可能是'sed' ... – twalberg

回答

1

使用這種模式應該匹配每一行,並獲得您希望保留部分:

^\d{2}\.\d{2}\.\d{4}\s(.*)$ 

你可以看到在這裏的行動模式的一個例子:http://regexr.com/38vq0

2

試試這個GNU sed命令,

$ sed -r 's/^[^ ]+? ([0-9]{2}:[0-9]{2}):[0-9]{2}(.*)$/\1\2/g' file 
12:13|STRING1|NUMBER1|NUMBER2|NUMBER3 

並通過AWK,

$ awk -F'|' -v OFS='|' '{sub (/^[^ ]+? /,"",$1); sub (/:[0-9]{2}$/,"",$1);}1' file 
12:13|STRING1|NUMBER1|NUMBER2|NUMBER3 
+0

對於sed'解決方案來說+1,但'+'而不是'+?'會做(除了不必要的,替換它可以讓你的解決方案在FreeBSD/OSX上工作爲那麼,如果你還用'-E'替換'-r':'sed -E's/^ [^] +([0-9] {2}:[0-9] {2}):[0 -9] {2}(。*)$/\ 1 \ 2/g'file') – mklement0

+0

像這樣'sed's/^ [^] \ + \([0-9] \ {2 \}: 0-9] \ {2 \} \):[0-9] \ {2 \} \(。* \)$/\ 1 \ 2/g'file' –

+0

是的,使用_basic_正則表達式更便於使用,但是您使用的不是POSIX basic-regex規範(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03)的一部分,並且無法使用例如OSX;將它替換爲'\ {1,\}':'sed's/^ [^] \ {1,\} \([0-9] \ {2 \}:[0-9] \ {2 \} \):[0-9] \ {2 \} \(。* \)$/\ 1 \ 2/g'file' – mklement0

1

使用awk

$ awk 'BEGIN{FS=OFS="|"}{split($1,fld,/[.: ]/);$1=fld[4]":"fld[5]}1' file 
12:13|STRING1|NUMBER1|NUMBER2|NUMBER3 
  • 設置輸入和輸出字段分隔符來|
  • 拆分空間上的第一列.:,並將值放入數組fld
  • 重新構造柱1到期望的數組值
  • 使用1打印行(這是說{print $0}的慣用方式。
3

這裏是一個awk

awk '{sub(/:[0-9]+\|/,"|",$2);print $2}' file 
12:13|STRING1|NUMBER1|NUMBER2|NUMBER3 

只要刪除從第二部分開始打印

+0

+1;聰明 - 迄今爲止最簡單的解決方案。 – mklement0

相關問題