'How to apply function on text selected in visual block
I often manipulate ascii files containing mac addresses in this format : DEADBEEFDEADBEEF and often have to transform it in this format de:ad:be:ef:de:ad:be:ef. Most of the time i have a sed expression to do this automatically when processing well defined files, but it happens i have to go and do it manually so i did this function :
function ConvertMac() range
s/\v(..)(..)(..)(..)(..)(..)(..)(..)/\L\1:\L\2:\L\3:\L\4:\L\5:\L\6:\L\7:\L\8/g
endfunction
This works only if the file has all mac addresses in a column organized file, with the mac in the first column. I would like to make it work when i select a visual block in any column, or even mac addresses on different columns.
Full example :
we have the following file that consist of 4 column in which i would like to change the 3rd column to the format i mentioned earlier :
1 DEADBEEFDEADBABE DEADBEEFDEADBEEF 1
2 DEADBEEFDEADBABE DEADBEEFDEADBEEF 2
3 DEADBEEFDEADBABE DEADBEEFDEADBEEF 3
4 DEADBEEFDEADBABE DEADBEEFDEADBEEF 4
5 DEADBEEFDEADBABE DEADBEEFDEADBEEF 5
6 DEADBEEFDEADBABE DEADBEEFDEADBEEF 6
7 DEADBEEFDEADBABE DEADBEEFDEADBEEF 7
8 DEADBEEFDEADBABE DEADBEEFDEADBEEF 8
9 DEADBEEFDEADBABE DEADBEEFDEADBEEF 9
10 DEADBEEFDEADBABE DEADBEEFDEADBEEF 10
11 DEADBEEFDEADBABE DEADBEEFDEADBEEF 11
With the above vim function, selecting the 3rd column in Visual Block mode and calling the command '<,'>call ConvertMac(), this will yield :
1 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 1
2 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 2
3 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 3
4 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 4
5 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 5
6 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 6
7 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 7
8 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 8
9 : : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 9
10: : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 10
11: : d:ea:db:ee:fd:eadb:ab:e : :de:ad:be:efDEADBEEF 11
The problem here is it is not taking the visual block selection into account, and is matching even the first characters in the pattern space.
What i would like instead is have only the visual block selection taken into account in the pattern space so the result would be :
1 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 1
2 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 2
3 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 3
4 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 4
5 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 5
6 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 6
7 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 7
8 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 8
9 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 9
10 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 10
11 DEADBEEFDEADBABE de:ad:be:ef:de:ad:be:ef 11
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
