移除字符串首尾空白
前言
除了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为输入字符串参数,[![:space:]]匹配非空格字符,${1%%[![:space:]]*}匹配" Hello World "的"Hello World ",向左截取得到的是左边的" "空白,${1#" "}向右截取第一个非空白字符,得到"Hello World ",$_为最近一次处理结果,也就是上面得到的"Hello World ",${_##*[![:space:]]}- 匹配
"Hello World "的"Hello World",向右截取得到右边的" "空白, ${_%" "}向左截取第一个非空白字符,最终得到"Hello World"。
总结
除#、##、%、%%之外,还有
${string:start:length}:从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。${string:start}:从 string 字符串的左边第 start 个字符开始截取,直到最后。${string:0-start:length}:从string 字符串的右边第 start 个字符开始,向右截取 length 个字符。${string:0-start}:从 string 字符串的右边第 start 个字符开始截取,直到最后。