Bash 将替换和子字符串提取一步结合

Bash 将替换和子字符串提取一步结合

对于这种格式的字符串:

./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

相关内容