如何在bash中清理字符串?

时间:2017-06-28 19:08:30

标签: bash

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

示例:

STAGE_NAME="Some usafe name 2/2#"

预期的消毒结果"

"some-unsafe-name-2-2"

逻辑:

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

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

1 个答案:

答案 0 :(得分:6)

您可以使用此纯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'