2017-01-27 6 views
0

У меня есть MAC-адрес, который выглядит следующим образом.Удалить начальные нули с MAC-адреса

01:AA:BB:0C:D0:E1

Я хочу, чтобы преобразовать его в нижний регистр и лишить ведущие нули.

1:aa:bb:c:d0:e1

Что это самый простой способ сделать это в Bash сценарий?

ответ

3
$ 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:]' 
+0

Я получаю вывод 'L0'. (GNU bash, версия 4.3.42 (1) -release (x86_64-apple-darwin15.3.0)) –

+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:]' ' –

+0

можно сделать одним выстрелом:' echo '01: AA: BB: 0C: D0: E1 '| sed -E 's/0 * ([^:] +)/\ L \ 1/g'' – Sundeep

2

Вот чистый Bash≥4 возможность:

mac=01:AA:BB:0C:D0:E1 
IFS=: read -r -d '' -a macary < <(printf '%s:\0' "$mac") 
macary=("${macary[@]#0}") 
macary=("${macary[@],,}") 
IFS=: eval 'newmac="${macary[*]}"' 
  • Линия IFS=: read -r -d '' -a macary < <(printf '%s:\0' "$mac") является каноническим для разбиения строки на массив,
  • expa nsion "${macary[@]#0}" является то, что из массива macary с ведущими 0 (если таковые имеются) удалены,
  • расширение "${macary[@],,}" является то, что из массива macary в нижнем регистре,
  • IFS=: eval 'newmac="${macary[*]}"' является стандартным способом, чтобы присоединиться к полям массива (обратите внимание, что использование eval совершенно безопасно).

После этого:

declare -p newmac 

дает

declare -- newmac="1:aa:bb:c:d0:e1" 

по мере необходимости.

+0

'<<(printf'% s: \ 0 '" $ mac ")' можно заменить на '<< <"$ mac:" ', правильно? Или я попал в какую-то ловушку? – anishsane

+0

@anishsane: это не сработает с многострочными аргументами. (Это не тот случай, но не больно показывать правильные шаблоны). –

+0

Код Bash дает мне представление о том, каково это для не-программиста, чтобы встретить какой-либо другой язык программирования. :) –

0

Более надежный способ для проверки MAC-адрес первого:

mac=01:AA:BB:0C:D0:E1 

a='([[:xdigit:]]{2})' ; regex="^$a:$a:$a:$a:$a:$a$" 
[[ $mac =~ $regex ]] || { echo "Invalid MAC address" >&2; exit 1; } 

, а затем, используя действительный результат матча регулярного выражения (BASH_REMATCH):

set -- $(printf '%x ' $(printf '0x%s ' "${BASH_REMATCH[@]:1}")) 
IFS=: eval 'printf "%s\n" "$*"' 

Что будет печатать:

1:aa:bb:c:d0:e1 

Hex-значения без начальных нулей и в нижнем регистре.
Если требуется верхний регистр, измените значение printf '%x ' на printf '%X '.
Если требуются нулевые нули, измените то же самое на printf '%02x '.

 Смежные вопросы

  • Нет связанных вопросов^_^