对于这种格式的字符串:
./my-site.sub.domain.com
我想删除.
、-
、 和/
,并将剩余部分修剪为 16 个字符:mysitesubdomainc
我已经这样做了
mysite="./my-site.sub.domain.com"
mysite=${mysite//[\.|\/|-]//}
mysite=${mysite:0:16}
echo $mysite
mysitesubdomainc
有没有办法将替换和子字符串提取结合起来?
答案1
没有办法链接 Bash 内置的参数扩展,但是当然这可以使用外部工具在一行中完成,例如sed
:
$ sed 's/[\.\/-]//g;s/^\(.\{16\}\).*/\1/' <<< "./my-site.sub.domain.com"
mysitesubdomainc
不幸的是,这很快就会变成无法维护的代码,并且可能比使用 Bash 内部效率低,所以我建议不要这样做。
答案2
为什么不使用 zsh?
$ echo ${${mysite//[\.\/-]/}:0:16}
mysitesubdomainc
(我稍微修改了你的代码)
答案3
正如 @l0b0 所说,我认为这不能在 shell 中一步完成,但使用外部工具就足够简单了(假设字符串保存在变量中$s
):
$ perl -pe 's#[.\-/]##g' <<<$s | grep -oP .{16}
mysitesubdomainc