如何在 bash 中删除字符串中间的字符

如何在 bash 中删除字符串中间的字符

在 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})

相关内容