如何替换字符串中重复出现的变量?

如何替换字符串中重复出现的变量?

我有一个代码块,如下所示:

DIV='_'
STRING=’1__2__3__4__5'

echo $STRING

结果是:

1__2__3__4__5

我希望结果看起来像这样:

1_2_3_4_5

由于这是较大代码库的片段,因此我无法$STRING直接编辑以删除重复的破折号。

我已经尝试过以下方法:

echo ${STRING//$DIV$DIV/$DIV}

echo $STRING | sed -E "s/$DIV$DIV/$DIV/g"

但结果仍然是:

1__2__3__4__5

我不能在替换命令中使用_代替,因为需要能够更改,但其数字始终由 2 个实例分隔。$DIV$DIV$STRING$DIV

答案1

使用tr

div=_
string=1__2__3__4__5

printf '%s\n' "$string" | tr -s -- "$div"

-s, --挤压重复

将最后指定的 SET 中列出的重复字符的每个序列替换为该字符的单次出现


使用 ksh93 风格的 shell 参数扩展(需要extglobwith bash):

shopt -s extglob
printf '%s\n' "${string//+("$div")/$div}"

这将匹配一个或多个模式_,并将它们替换为一个_

答案2

也许这会帮助您获得预期的结果

#!/bin/bash
# GNU bash, version 4.4.20

string="1__2__3__4__5" ; echo "${string//__/_}"

测试于:https://rextester.com/l/bash_online_compiler

相关内容