A friend asked me the other day whether a certain “search and replace” operation over a credit card number could be done with sed: Given a number like 5105 1051 0510 5100, replace the first three components with something and leave the last one intact.
So my first take on this was:
# echo 5105 1051 0510 5100 | sed -e 's/^\([0-9]\{4\} \)\{3\}/lala /' lala 5100
which works, but is not very legible. So here is taking advantage of the -r
flag, if your modern sed supports it:
# echo 5105 1051 0510 5100 | sed -re 's/^([[:digit:]]{4} ){3}/lala /' lala 5100
So my friend asked, why not use \d
instead of [[:digit:]]
(or even [0-9]
)?
# echo 5105 1051 0510 5100 | sed -re 's/^(\d{4} ){3}/lala /' 5105 1051 0510 5100
Why does this not work? Because as it is pointed in the manual:
In addition, this version of sed supports several escape characters (some of which are multi-character) to insert non-printable characters in scripts (\a, \c, \d, \o, \r, \t, \v, \x). These can cause similar problems with scripts written for other seds.
There. I guess that is why I still do not make much use of the -r
flag and prefer to escape parentheses when doing matches in sed.