我有一个代码块,如下所示:
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 参数扩展(需要extglob
with 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//__/_}"