在 bash 中,我有一个字符串,我想删除字符串中间的一个字符。我知道我们可以像这样从字符串的开头或结尾删除字符:
myVar='YES'
myVar="${myVar#'Y'}"
myVar="${myVar%'S'}"
但是我怎样才能删除中间的一个?
答案1
如果您知道要删除哪些字符,则可以在参数扩展中使用替换:
myVar=${myVar/E} # Replace E with nothing
或者,如果你知道要保留哪些字符:
myVar=${myVar/[^YS]} # Replace anything but Y or S
或者,如果你知道这个职位:
myVar=${myVar:0:1}${myVar:2:1} # The first and third characters
答案2
删除第一的字符,但不是其余字符,请使用单个斜线,如下所示:
myVar='YES WE CAN'
echo "${myVar/E}"
# YS WE CAN
去除全部,使用双斜杠:
echo "${myVar//E}"
# YS W CAN
您不仅可以替换单个字符,还可以替换较长的正则表达式模式。查看更多变量扩展/子字符串替换的示例这里。
答案3
我编写的一个函数,用于在 Bash 中修剪字符串的中间部分:
folder=$1
declare -i maxLen=60
function trimMiddleString() {
# param 1 = the initial string
# param 2 = max length of trimmed string
local loc_OrigStr="$1"
declare loc_max=$2
local loc_result=${loc_OrigStr}
declare -i loc_lenStr=${#loc_OrigStr}
if ((loc_lenStr > loc_max)); then
declare -i numHalfMax=$((loc_max / 2))
declare -i numShowBegin=$((numHalfMax - 3))
local part1=${loc_OrigStr:0:${numShowBegin}}
declare -i numSkip=$((loc_lenStr - numHalfMax))
local part2=${loc_OrigStr:${numSkip}}
loc_result="${part1}...${part2}"
fi
echo "${loc_result}"
}
displayFolder=$(trimMiddleString "${folder}" ${maxLen})