$ echo 01:AA:BB:0C:D0:E1 | sed 's/\(^\|:\)0/\1/g;s/.*/\L\0/'
1:aa:bb:c:d0:e1
\(^\|:\)0
представляет собой либо начало строки (^
) или :
, после чего 0. Мы хотим, чтобы заменить это захват (либо линий начинают или :
), который устранил 0
.
Затем вторая подстановка (s/.*/\L\0/
) помещает всю строчку в нижний регистр.
$ sed --version | head -1
sed (GNU sed) 4.2.2
EDIT: В качестве альтернативы:
echo 01:AA:BB:0C:D0:E1 | sed 's/0\([0-9A-Fa-f]\)/\1/g;s/.*/\L\0/'
0x
Это заменяет (с x
любая шестнадцатеричная цифра) по x
.
EDIT: если ваш sed
не поддерживает \L
, используйте tr
:
echo 01:AA:BB:0C:D0:E1 | sed 's/0\([0-9A-Fa-f]\)/\1/g' | tr '[:upper:]' '[:lower:]'
Я получаю вывод 'L0'. (GNU bash, версия 4.3.42 (1) -release (x86_64-apple-darwin15.3.0)) –
[Я не могу сказать, какая версия sed у меня есть] (https://stackoverflow.com/questions/37639496/ how-can-i-check-the-version-of-sed-in-os-x), но это OSX 10.12.3. Это то, что в конечном счете сработало: 'echo 01: AA: BB: 0C: D0: E1 | sed 's/0 \ ([0-9A-F] \)/\ 1/g' | tr '[: upper:]' '[: lower:]' ' –
можно сделать одним выстрелом:' echo '01: AA: BB: 0C: D0: E1 '| sed -E 's/0 * ([^:] +)/\ L \ 1/g'' – Sundeep