在VI中搜尋和替換

在VI中搜尋和替換

我需要將下面的字串中的“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,同時英維(四個中最符合標準的一個)不是。

相關內容