从MAC地址中删除前导零

时间:2017-01-27 13:35:22

标签: bash sed

我的MAC地址看起来像这样。

def piecewise_linear(x, x0, x1, y0, y1, k1, k2, k3): conds = [x<x0, (x>=x0) & (x<x1),x>=x1] funcs = [lambda x:k1*(x-x0) + y0, lambda x:k2*(x-x0) + y0, lambda x:k2*(x1-x0) + y0 + k3*(x-x1)] return np.piecewise(x, conds, funcs) p , e = curve_fit(piecewise_linear, x, y) xd = np.linspace(-1.3, 1.5, 100) plt.plot(x, y, "o") plt.plot(xd, piecewise_linear(xd, *p))

我想将其转换为小写并删除前导零。

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

在Bash脚本中执行此操作的最简单方法是什么?

3 个答案:

答案 0 :(得分: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

编辑:另外:

echo 01:AA:BB:0C:D0:E1 | sed 's/0\([0-9A-Fa-f]\)/\1/g;s/.*/\L\0/'

这会将0x替换为xx任何六位数)。

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

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

答案 1 :(得分: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")是将字符串拆分为数组的规范方法,
  • 展开"${macary[@]#0}"是数组macary的展开,其中前导0(如果有)已被删除,
  • 扩展"${macary[@],,}"是数组macary的小写字母
  • IFS=: eval 'newmac="${macary[*]}"'是加入数组字段的标准方法(请注意,使用eval非常安全)。

之后:

declare -p newmac

产量

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

根据需要。

答案 2 :(得分: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

十六进制值,不带前导零和小写。
如果需要大写字母,请将printf '%x '更改为printf '%X ' 如果需要前导零,请将其更改为printf '%02x '