[bash] 쉘 스크립트에서 하나의 하위 문자열을 다른 문자열로 교체

나는 “Suzi와 Marry를 좋아한다”고 “Suzi”를 “Sara”로 바꾸고 싶다.

#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
# do something...

결과는 다음과 같아야합니다.

firstString="I love Sara and Marry"



답변

처음 나타나는 패턴을 주어진 문자열로 바꾸려면 다음을 사용하십시오 .${parameter/pattern/string}

#!/bin/bash
firstString="I love Suzi and Marry"
secondString="Sara"
echo "${firstString/Suzi/$secondString}"    
# prints 'I love Sara and Marry'

모든 발생 을 바꾸려면 다음을 사용하십시오 .${parameter//pattern/string}

message='The secret code is 12345'
echo "${message//[0-9]/X}"           
# prints 'The secret code is XXXXX'

(이 설명되어 배쉬 참조 설명서 §3.5.3, “쉘 매개 변수 확장을” .)

이 기능은 POSIX (Bash 확장)에 의해 지정되지 않았으므로 모든 Unix 쉘이이를 구현하지는 않습니다. 관련 POSIX 문서 는 Open Group 기술 표준 기본 사양, Issue 7 , Shell & Utilities 볼륨, §2.6.2 “매개 변수 확장”을 참조하십시오 .


답변

이것은 bash 문자열 조작으로 완전히 수행 할 수 있습니다.

first="I love Suzy and Mary"
second="Sara"
first=${first/Suzy/$second}

첫 번째 항목 만 대체합니다. 그것들을 모두 바꾸려면 첫 번째 슬래시를 두 배로하십시오.

first="Suzy, Suzy, Suzy"
second="Sara"
first=${first//Suzy/$second}
# first is now "Sara, Sara, Sara"


답변

대시의 경우 모든 이전 게시물이 작동하지 않습니다

POSIX sh호환 솔루션은 다음과 같습니다.

result=$(echo "$firstString" | sed "s/Suzi/$secondString/")


답변

이 시도:

 sed "s/Suzi/$secondString/g" <<<"$firstString"


답변

sed문자열에 RegExp 문자 가있는 경우 보다 bash를 사용하는 것이 좋습니다 .

echo ${first_string/Suzi/$second_string}

그것은 Windows에 이식 가능하며 Bash 3.1만큼 오래되었습니다.

이스케이프에 대해 크게 걱정할 필요가 없음을 보여주기 위해

/home/name/foo/bar

이것으로 :

~/foo/bar

그러나 /home/name처음에있는 경우에만 . 우리는 필요하지 않습니다 sed!

bash는 마법 변수를 제공 $PWD하고 다음 $HOME과 같이 할 수 있습니다.

echo "${PWD/#$HOME/\~}"

편집 : 인용 / 이스케이프에 대한 주석에서 Mark Haferkamp 에게 감사드립니다 ~. *

변수 $HOME에 슬래시가 어떻게 포함되어 있는지 확인 하지만 아무것도 깨지 않았습니다.

추가 자료 : Advanced Bash-Scripting Guide .
사용 sed이 필수 인 경우 모든 문자 하십시오 .


답변

내일 당신이 결혼을 좋아하지 않기로 결정하면 그녀도 교체 될 수 있습니다.

today=$(</tmp/lovers.txt)
tomorrow="${today//Suzi/Sara}"
echo "${tomorrow//Marry/Jesica}" > /tmp/lovers.txt

연인을 떠나는 방법은 50 가지가 있어야합니다.


답변

댓글을 추가 할 수 없으므로 @ruaka 예제를 더 읽기 쉽게 작성하려면 다음과 같이 작성하십시오

full_string="I love Suzy and Mary"
search_string="Suzy"
replace_string="Sara"
my_string=${full_string/$search_string/$replace_string}
or
my_string=${full_string/Suzy/Sarah}