Bash 从MAC地址中删除前导零

Bash 从MAC地址中删除前导零,bash,sed,Bash,Sed,我有一个像这样的MAC地址 01:AA:BB:0C:D0:E1 我想把它转换成小写,去掉前导零 1:aa:bb:c:d0:e1 在Bash脚本中,最简单的方法是什么 $ 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 --v

我有一个像这样的MAC地址

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

我想把它转换成小写,去掉前导零

1:aa:bb:c:d0:e1

在Bash脚本中,最简单的方法是什么

$ 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
编辑:或者:

echo 01:AA:BB:0C:D0:E1 | sed 's/0\([0-9A-Fa-f]\)/\1/g;s/.*/\L\0/'
这将
0x
(使用
x
任何六位数)替换为
x

编辑:如果您的
sed
不支持
\L
,请使用
tr

echo 01:AA:BB:0C:D0:E1 | sed 's/0\([0-9A-Fa-f]\)/\1/g' | tr '[:upper:]' '[:lower:]'
\(^\\\\:\)0
表示行开始(
^
)或一个
,后跟一个0。 我们想用捕获(行开始或
)来代替它,它删除了
0

然后,第二个替换(
s/*/\L\0/
)将整行小写

$ sed --version | head -1
sed (GNU sed) 4.2.2
编辑:或者:

echo 01:AA:BB:0C:D0:E1 | sed 's/0\([0-9A-Fa-f]\)/\1/g;s/.*/\L\0/'
这将
0x
(使用
x
任何六位数)替换为
x

编辑:如果您的
sed
不支持
\L
,请使用
tr

echo 01:AA:BB:0C:D0:E1 | sed 's/0\([0-9A-Fa-f]\)/\1/g' | tr '[:upper:]' '[:lower:]'

这是一场纯粹的狂欢≥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[*]}"'
屈服

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

根据需要。

这里是一场纯粹的狂欢≥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[*]}"'
屈服

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

根据需要。

更可靠的方法是首先验证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):

将打印:

1:aa:bb:c:d0:e1
不带前导零且小写的十六进制值。
如果需要大写,请将
printf“%x”
更改为
printf“%x”


如果需要前导零,请将其更改为
printf“%02x”

更可靠的方法是首先验证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):

将打印:

1:aa:bb:c:d0:e1
不带前导零且小写的十六进制值。
如果需要大写,请将
printf“%x”
更改为
printf“%x”


如果需要前导零,请将其更改为
printf“%02x”

我将获得输出
L0
。(GNUBash,版本4.3.42(1)-发行版(x86_64-apple-darwin15.3.0)),但它是OSX 10.12.3。这就是最终起作用的:
echo 01:AA:BB:0C:D0:E1 | sed's/0\([0-9A-F]\)/\1/g'| tr'[:upper:][:lower:][:lower:][:lower:][/code>可以一次完成:
echo'01:AA:BB:0C:D0:E1 | sed-E's/0*([^::+)/\L\1/g'
我得到输出。(GNUBash,版本4.3.42(1)-发行版(x86_64-apple-darwin15.3.0)),但它是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'
这对多行参数不起作用。(这里不是这样,但显示正确的模式并没有什么坏处)。Bash代码让我感觉到非程序员遇到任何其他编程语言时的感觉啊,
<@anishsane:这对多行参数不起作用。(这里不是这样,但显示正确的模式并没有什么坏处)。Bash代码让我感觉到非程序员遇到任何其他编程语言时的感觉啊,