我的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脚本中执行此操作的最简单方法是什么?
答案 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
替换为x
(x
任何六位数)。
编辑:如果您的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 '
。