我嘗試使用逗號 (,) 來分隔前兩個數字欄位中的數千個 vim command
%s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/g
但在這種情況下,它也會在第二行的 9,995 中添加逗號,我可以用什么來替換特定的 N < g 出現。
輸入
BitstreamCyberCJK;Freeware;30275;28686;v2.0 ;beta (1998-03-17)
Y.OzFontN;Freeware;21957;7621;v13.00 sfnt rev 9995; Pen-Ji (2010-08-24)
預期產出
BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 ;beta (1998-03-17)
Y.OzFontN;Freeware;21,957;7,621;v13.00 sfnt rev 9995; Pen-Ji (2010-08-24)
uj5u.com熱心網友回復:
有一種方法可以重復最后一個命令:@:此外,您可以指定重復次數,例如:10@:。
所以,從只替換第一個匹配開始: %s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/
然后,由于我們已經完成了 N 個替換之一,因此重復 N-1 次。
例如,要替換前 10 個數字,請使用:
%s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/
9@:
uj5u.com熱心網友回復:
我會使用更短、更易于管理的搜索模式:
:%s/\(\d\)\(\d\{3}\);/\1,\2;/g
然后,我將洗掉/g標志以僅替換每行上的第一場比賽,因為目標是特別不替換所有行上的所有比賽:
:%s/\(\d\)\(\d\{3}\);/\1,\2;
然后,我會在每一行上重復最后一次替換:
g&
見:help \d,:help \{,:help :s_flags,和:help g&。
uj5u.com熱心網友回復:
上面已經有很好的答案,但我將分享我將如何處理它。(因為我不想計算“N”是多少,也不想重復替換卻發現我做了太多,等等。)
我會使用上面列出的替換之一,例如:%s/\(\d\)\(\d\{3}\);/\1,\2;/g. 然后我將運行第二次替換,搜索“rev”并洗掉逗號(如果存在):
%s/\(rev \d\),\(\d\{3\};\)/\1\2/g
% g all lines, and all occurences on a line
s/ / / substitute
\( \) \( \) backref capture groups
rev \d text "rev " and a digit (backref 1)
, comma
\d\{3\}; three digits and a semicolon (backref 2)
\1\2 backrefs 1 and 2
一些注意事項——
- 如果您知道“rev”在一行中只出現一次,那么您可以省略
g替換末尾的 。 - 如果“rev”不知何故出現在檔案的其他背景關系中——可能是像“Foo bar abbrev 4,321”這樣的文本——那么你需要考慮到這一點。
- 如果沒有匹配的 "rev " 后跟一個數字和一個逗號,那么 Vim 將給出一個 "pattern not found" 訊息。
此外,這將搜索一個帶逗號的四位數字。如果您想洗掉逗號的五位或六位數字,那么您可以使用它,這幾乎相同:
%s/\(rev \d\{1,3\}\),\(\d\{3\}\);/\1\2/g
\d\{1,3\} , 1 to 3 digits followed by a comma
uj5u.com熱心網友回復:
首先,我建議您清理正則運算式:
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/g
其次,g最后的標志使 vim 替換所有出現的事件。沒有標志,它只會替換第一個。由于%在每一行上運行替換,%s//g將替換每一行上的第一次出現。
由于您想替換前兩次出現,您可以只運行兩次。然而,我們想在這里優雅一點。有:&重復最后一次替換的命令。我們甚至可以將它們鏈接在一起:
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/ | %&
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/346037.html
