每天一点Shell小知识

265 阅读1分钟

移除字符串首尾空白

前言

除了sed, awk, perl等这些命令来截取字符外,来点不一样的,通过字符串trim来巩固下shell字符截取。

重点:

  • ###%%%的使用
  • :的使用

方法

trim_string() {
    # Usage: trim_string "   example   string    "
    : "${1#"${1%%[![:space:]]*}"}"
    : "${_%"${_##*[![:space:]]}"}"
    printf '%s\n' "$_"
}

例子

$ trim_string "    Hello,  World    "
Hello,  World

分析

  • ${string#*chars}:从string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
  • ${string##*chars}:从string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
  • ${string%chars*}:从string 字符串第一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。
  • ${string%%chars*}:从string 字符串最后一次出现 chars* 的位置开始,截取 chars* 左边的所有字符。

处理过程

  1. $1为输入字符串参数,[![:space:]]匹配非空格字符,
  2. ${1%%[![:space:]]*}匹配"   Hello World ""Hello World   ",向左截取得到的是左边的"   "空白,
  3. ${1#"   "}向右截取第一个非空白字符,得到"Hello World   "
  4. $_为最近一次处理结果,也就是上面得到的"Hello World   "
  5. ${_##*[![:space:]]}
  6. 匹配"Hello World   ""Hello World",向右截取得到右边的"   "空白,
  7. ${_%"   "}向左截取第一个非空白字符,最终得到"Hello World"

总结

###%%%之外,还有

  • ${string:start:length}:从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
  • ${string:start}:从 string 字符串的左边第 start 个字符开始截取,直到最后。
  • ${string:0-start:length}:从string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
  • ${string:0-start}:从 string 字符串的右边第 start 个字符开始截取,直到最后。