문자열에서 반복되는 변수를 바꾸는 방법은 무엇입니까? [폐쇄]

문자열에서 반복되는 변수를 바꾸는 방법은 무엇입니까? [폐쇄]

다음과 같은 코드 블록이 있습니다.

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//__/_}"

테스트 대상:https://rextester.com/l/bash_online_compiler

관련 정보