다음과 같은 코드 블록이 있습니다.
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, --squeeze 반복
마지막으로 지정된 SET에 나열된 각 반복 문자 시퀀스를 해당 문자의 단일 발생으로 바꿉니다.
ksh93 스타일 셸 매개변수 확장을 사용합니다( extglob
가 필요함 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//__/_}"