Bash 从MAC地址中删除前导零
我有一个像这样的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
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代码让我感觉到非程序员遇到任何其他编程语言时的感觉啊,