我需要將下面的字串中的“12.22.54”轉換為“12:22:54”,以便它可以在 MS SQL 中運作。
cast('14-JAN-14 06.65.22 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 12.22.36 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 22.13.54 AM' as datetime),'63.124.79.253');
我嘗試在 vi 中打開該文件並替換為
:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g
但這不起作用。請幫忙。
答案1
為了避免 IP 位址,我只是在匹配字串周圍添加空格:
:%s/ \(\d\d\)\.\(\d\d\)\.\(\d\d\) / \1:\2:\3 /g
答案2
vi
不使用 perl 風格的正規表示式。你寫了
:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g
但vi
用這樣的語法( vim 和 vile Accept \d
,但你說“六”):
:s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g
(“z”從哪裡來?)。
關鍵在於 Perl 所說的「已棄用」的是向後引用的 POSIX 語法。當然,當 Larry Wall 還在的時候,Perl 永遠不會被標準化。
根據評論,OP 的意圖是更改所有行。在 vi 中,這是使用特殊範圍完成的%
:
:%s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g
人們也可以明確地使用一個範圍($
也是 POSIX):
:1,$s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g
還有其他方法可以建立邊界以避免 IP 位址。但根據給出的示例,空白就足夠了:
:s/ \([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\) / \1:\2:\3 /g
同樣地,維姆和卑鄙的接受\s
空格,但 POSIX 只接受文字空格(如圖所示)或字元類別[:space:]
。大多數人發現打字[spacetab]比[[:space:]]
.
如前所述,如果您說“vi”,其他人可能會選擇根據標準 (POSIX) 行為進行回答。一些可以取代“vi”的編輯器提供了正規表示式語法的擴充。快速檢查表明艾爾維斯也支援 Perl 風格\d
和\s
,同時英維(四個中最符合標準的一個)不是。