bash - 如何清理 bash 中的字符串?

标签 bash

我有一个自由格式的字符串,我需要在 bash 中对其进行清理,以生成安全且美观的文件名。

例子:

STAGE_NAME="Some usafe name 2/2#"

预期的 sanitizer 结果“

"some-unsafe-name-2-2"

逻辑:

  • 小写字符
  • 将所有不受支持或不安全的字符替换为 dash(包括空格)
  • 删除重复的破折号
  • 从前缀或后缀中删除任何破折号

允许使用像 sed 这样的外部工具,只要它们是可移植的(不使用 BSD/OSX/... 上不可用的选项)。

最佳答案

您可以使用这个纯 bash 函数进行清理:

sanitize() {
   local s="${1?need a string}" # receive input in first argument
   s="${s//[^[:alnum:]]/-}"     # replace all non-alnum characters to -
   s="${s//+(-)/-}"             # convert multiple - to single -
   s="${s/#-}"                  # remove - from start
   s="${s/%-}"                  # remove - from end
   echo "${s,,}"                # convert to lowercase
}

然后称它为:

sanitize "///Some usafe       name  2/2##"
some-usafe-name-2-2

sanitize "Some usafe name 2/2#"
some-usafe-name-2-2 

只是为了学术练习,这里有一个 awk 单行代码做同样的事情:

awk -F '[^[:alnum:]]+' -v OFS=- '{$0=tolower($0); $1=$1; gsub(/^-|-$/, "")} 1'

关于bash - 如何清理 bash 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44810685/

相关文章:

linux - Bash 压缩脚本

bash -\ curl ... | bash ...斜线是做什么用的?

bash - centOS 7如何分配静态ip?

linux - 如何在bash中用另一个整数变量来增加一个整数变量?

linux - 在远程计算机上运行脚本时如何在我的计算机上发出 "beep"?

linux - 如何删除名称最大的目录?

linux - 从后台进程读取命名管道

linux - 为什么在将 ls 传输到 mkdir 时会出现奇怪的类似时间戳的包含?

bash - 如何通过 https 并行运行多个 curl 命令

linux - 从变量输出中获取特定行