Bash - 如何获取字符串长度排除转义字符
Bash - How to get string length exclude escape character
我在 ~/.bashrc 中写了一个函数来根据当前终端宽度绘制一条水平线。
p_blod=$(tput bold) #use p_orig to reset it
p_red=$(tput setaf 1) #print red
p_blue=$(tput setaf 21) #print blue
p_yellow=$(tput setaf 11) #print yellow
p_orig=$(tput sgr0) #print back original color
vzone() {
: "${3?"Usage : vzone '='(separator) y/b(color) b(bold)/nb(not blod) [separator_length_if_need_exclude_escape]"}" #\space or \(
local vzone_sep=""
if [[ -z ]]; then
local t_cols=${#vzone_sep} #only if the string didn't included escape characters
else
local t_cols=""
fi
if [[ "" == "b" ]]; then
printf "%s" "${p_blod}"
fi
if [[ "" == "y" ]]; then
printf "%s" "${p_yellow}"
else
printf "%s" "${p_blue}"
fi
eval printf %.0s"$vzone_sep" $(seq 1 "$((COLUMNS/t_cols))"); echo
printf "%s" "${p_orig}"
}
然后来电者画一条线:
vzone '\(◔‿◔\)\ ♥' y b 7
截图:
如你所见,如果我没有手动计算放 7,那行会出错,因为 ${#vzone_sep} 会给我总计字符串包含转义字符斜杠 /
让我展示一个狭义的例子:
[xiaobai@xiaobai tmp]$ vzone_sep="\(◔‿◔\)\ ♥"
[xiaobai@xiaobai tmp]$ printf ${#vzone_sep}
10[xiaobai@xiaobai tmp]$
我想要的是 7 个,而不是包含转义字符的 10 个。因此调用者不必在调用我的函数之前手动计算长度减去转义字符。
感谢任何帮助。
vzone_sep="\(◔‿◔\)\ ♥"
cleaned="${vzone_sep//\/}" # remove all \
printf "%d" "${#cleaned}"
输出:
7
我在 ~/.bashrc 中写了一个函数来根据当前终端宽度绘制一条水平线。
p_blod=$(tput bold) #use p_orig to reset it
p_red=$(tput setaf 1) #print red
p_blue=$(tput setaf 21) #print blue
p_yellow=$(tput setaf 11) #print yellow
p_orig=$(tput sgr0) #print back original color
vzone() {
: "${3?"Usage : vzone '='(separator) y/b(color) b(bold)/nb(not blod) [separator_length_if_need_exclude_escape]"}" #\space or \(
local vzone_sep=""
if [[ -z ]]; then
local t_cols=${#vzone_sep} #only if the string didn't included escape characters
else
local t_cols=""
fi
if [[ "" == "b" ]]; then
printf "%s" "${p_blod}"
fi
if [[ "" == "y" ]]; then
printf "%s" "${p_yellow}"
else
printf "%s" "${p_blue}"
fi
eval printf %.0s"$vzone_sep" $(seq 1 "$((COLUMNS/t_cols))"); echo
printf "%s" "${p_orig}"
}
然后来电者画一条线:
vzone '\(◔‿◔\)\ ♥' y b 7
截图:
如你所见,如果我没有手动计算放 7,那行会出错,因为 ${#vzone_sep} 会给我总计字符串包含转义字符斜杠 /
让我展示一个狭义的例子:
[xiaobai@xiaobai tmp]$ vzone_sep="\(◔‿◔\)\ ♥"
[xiaobai@xiaobai tmp]$ printf ${#vzone_sep}
10[xiaobai@xiaobai tmp]$
我想要的是 7 个,而不是包含转义字符的 10 个。因此调用者不必在调用我的函数之前手动计算长度减去转义字符。
感谢任何帮助。
vzone_sep="\(◔‿◔\)\ ♥"
cleaned="${vzone_sep//\/}" # remove all \
printf "%d" "${#cleaned}"
输出:
7