문자열의 일부 문자를 다른 문자로 교체


279

내가 좋아하는 캐릭터가 AxxBCyyyDEFzzLMN을 나는 모든 사건 대체 할 X , YZ를 함께 _ .

어떻게하면 되나요?

나는 그것이 효과가 있다는 것을 알고 echo "$string" | tr 'x' '_' | tr 'y' '_'있지만 파이프를 사용하지 않고 한 번에 그렇게하고 싶습니다.


연속적인 x, y 또는 z 시퀀스를 하나의 밑줄로 바꾸 시겠습니까, 아니면 x, y 또는 z를 하나의 밑줄 로 바꾸 시겠습니까? 또한 혼합 시퀀스는 AxyzB어떻습니까? 밑줄 세 개 또는 하나?
David Z

tr '[xyz]'[및 을 대체 ]합니다. 인수는 단순히 문자 목록이어야합니다 (같은 범위 a-z는 괜찮지 만 일부 구현에서는 POSIX 문자 클래스와 같습니다 [:digit:]).
tripleee

답변:


329
echo "$string" | tr xyz _

각각의 발생 대체 할 것이다 x, y또는 z과를 _주고, A__BC___DEF__LMN당신의 예에.

echo "$string" | sed -r 's/[xyz]+/_/g'

의 반복 발생 대체 할 것이다 x, y또는 z단일를 _제공, A_BC_DEF_LMN당신의 예에.


19
Mac에서는 다음과 같은 결과를 얻었습니다. sed : illegal option-r 사용법 : sed script [-Ealn] [-i extension] [file ...] sed [-Ealn] [-i extension] [-e script]. .. [-f script_file] ... [file ...]
catanore

,[]{}()~문자 가 포함 된 문자열이 있습니다 . '\'원샷 으로 어떻게 처리 할 수 ​​있습니까? 각 특수 문자로 대체하고 싶습니다 .
inckka

2
@halakala Mac은 약간 다른 버전의 sed와 함께 제공됩니다. 이 질문을 참조하십시오 unix.stackexchange.com/questions/13711/...는 대신 당신은 "GNU-나오지도"브루 패키지 관리자와 다음 사용 설치할 수 gsed진 : $ brew install gnu-sed다음$ gsed -r 's/[xyz]+/_/g'
존 케리

6
* BSD (및 OSX)에서 sed -E(기본적으로) sed -r많은 Linux 배포판에서 (기본적으로) 동일 합니다. 사용하는 경우 sed 's/[xyz][xyz]*/_/g'옵션이 필요하지 않습니다. 물론 이것은 tr -s xyz _실제 필요가없는 것과 같습니다 sed.
tripleee

@inckka 당신은 그것을 사용할 수 없습니다 tr. sed 's/[][{}()~,]/\\&/g'그러나 실제로 후속 질문이 있으면 새로운 질문을하십시오 (물론 참조를 위해 여기로 다시 링크하십시오). 덧붙여, ,그리고 ~(비록 정규 표현식 메타 문자없는 ~확장됩니다 $HOME;하지 배쉬에 의해 약간의 위치와 일부 다른 셸 sh그러나이).
tripleee

286

사용 배쉬 매개 변수 확장을 :

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}

7
나쁜 대체품
Alexey

1
@ Alexey, 내 예제는 나를 위해 작동합니다 (bash 4.3.11 (1) -release). 사용하고 있는지 확인하십시오 bash. 다른 쉘은 작동하지 않을 수 있습니다 (일부는하지만).
Matthew Flaschen

@MatthewFlaschen 감사합니다. 이것은 정확히 bash 스크립트에서 절대 경로에 대한 sed replace를 수행하는 데 필요한 것입니다 (/를 \ /로 바꾸면 sed가 허용합니다).
Ryan G

1
@RyanG sedbash가 내장 대체를 사용하는 경우 왜 사용 합니까?
MestreLion 2012 년

@MestreLion 그것은 잘못 나왔을 수도 있지만, 파일 묶음의 표준 변수 이름을 절대 경로로 바꾸어야했습니다. 그러나 명령에서 빠져 나오지 않으면 "/"를 가질 수 없습니다. bash에서 작업을 함께 묶었습니다. 이것이 bash에서 문자열을 조작하는 가장 좋은 방법이 아닐까요?
Ryan G

111

이 링크가 도움이 될 수 있습니다.

http://tldp.org/LDP/abs/html/string-manipulation.html

일반적으로

$ substring의 첫 번째 일치 항목을 $ replacement로 바꾸려면 다음을 수행하십시오.

${string/substring/replacement}

$ substring의 모든 일치 항목을 $ replacement로 바꾸려면 다음을 수행하십시오.

${string//substring/replacement}

편집 : 이것은 $ string 변수에 적용됩니다.


16
이것은 리터럴 문자열이 아닌 "string"이라는 변수에서 작동 합니다.
mattdm

1
참조가 포함되어 있으므로 가장 유용합니다.
Os3

가장 짧은 솔루션.
northtree

8
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^ 필요한만큼 사용하면 나만의 BASIC 암호화를 만들 수 있습니다


5

다음은 여러 인접 항목을 단일 항목으로 대체하는 셸 매개 변수 확장 솔루션입니다 _.

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

것을 알 패턴으로 켜져 확장 패턴 매칭을 필요로+(pattern)

shopt -s extglob

또는 -s( "squeeze") 옵션을 사용하여 tr:

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.