'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
vim


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source