programing

셸 스크립트에서 하위 문자열 하나를 다른 문자열로 바꿉니다.

easyjava 2023. 4. 9. 22:31
반응형

셸 스크립트에서 하위 문자열 하나를 다른 문자열로 바꿉니다.

저는 '수지랑 결혼해'가 있는데 '수지'를 '사라'로 바꾸고 싶어요.

firstString="I love Suzi and Marry"
secondString="Sara"

원하는 결과:

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'

(이는 Bash 레퍼런스 매뉴얼, § 3.5.3 "쉘 파라미터 확장"에 기재되어 있습니다.)

이 기능은 POSIX에 의해 지정되어 있지 않기 때문에(Bash 확장) 모든 Unix 쉘에서 구현되는 것은 아닙니다.관련 POSIX 문서에 대해서는, 「오픈 그룹 테크니컬·스탠다드·베이스·스페시피케이션」,제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"

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

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

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

이것은 각 입력 행의 첫 번째 항목을 대체합니다.를 추가합니다./g모든 항목을 바꾸도록 플래그를 지정합니다.

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

이것을 시험해 보세요.

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

Bash를 사용하는 것이 더 좋습니다.sed문자열에 정규 표현 문자가 있는 경우.

echo ${first_string/Suzi/$second_string}

Windows에 이식 가능하며 적어도 Bash 3.1 이전 버전에서도 작동합니다.

탈출에 대해 크게 걱정할 필요가 없다는 것을 보여주기 위해 다음을 수행합니다.

/home/name/foo/bar

이 경우:

~/foo/bar

하지만 만약/home/name시작 단계입니다.필요없다sed!

배쉬가 우리에게 마법 변수를 준다면$PWD그리고.$HOME이하를 실현합니다.

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

Mark Haferkamp가 견적/회피에 관한 노트에 코멘트를 써주셔서 감사합니다.~.*

변수가 어떻게$HOME찰과상을 입었지만 아무것도 깨지지는 않았어요

추가 정보:Advanced Bash-Scripting Guide
사용하는 경우sed꼭 빼놓을 수 없는 캐릭터입니다.

echo [string] | sed "s|[original]|[target]|g"
  • "s"는 "부적합"을 의미합니다.
  • "g"는 "전역적으로 일치하는 모든 발생"을 의미합니다.

만약 내일 당신이 메리를 사랑하지 않는다고 결정한다면 그녀도 대신할 수 있습니다.

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}

AWK 사용:

firstString="I love Suzi and Marry"
echo "$firstString" | awk '{gsub("Suzi","Sara"); print}'

Roman Kazanovskyi 답변달리 셸의 네이티브 파라미터 확장만 있으면 되는 순수 POSIX 쉘 방식.긴 파일 이름이 최소화되므로 코드가 한 줄에 더 적합합니다.

f="I love Suzi and Marry"
s=Sara
t=Suzi
[ "${f%$t*}" != "$f" ] && f="${f%$t*}$s${f#*$t}"
echo "$f"

출력:

I love Sara and Marry

구조:

  • 최소 접미사 패턴을 제거합니다. "${f%$t*}"접미사가 있는 경우 "를 반환합니다.I love$t「」가 들어가 있다.Suzi*$f ."I loveSuzi and Marry

  • , 만약 ★★★★★★★★★★★★★★★★.t=Zelda , , , 「 」"${f%$t*}"는 아무것도 삭제하지 않고 문자열 I love Suzi and Marry전체를 반환합니다.

  • 하다, 하다, 하다, 하다를 할 때 합니다.$t$f[ "${f%$t*}" != "$f" ] 경우, 이 값은 true로 평가됩니다.$fstring에는 Suzi*" 가 포함되어 있고, 포함되지 않으면 false 가 포함되어 있습니다.

  • 테스트가 true를 반환하는 경우 최소 접미사 패턴 제거를 사용하여 원하는 문자열을 구성합니다. ${f%$t*}"I love최소 프리픽스 패턴 삭제 ${f#*$t}번째 문자열이 있는 " "and Marry$s그 사이에.Sara

첫 번째 오카렌스를 특수 문자로 대체하는 패턴:

${파라미터/패턴/문자열}

모든 오카렌스를 특수 문자로 대체하는 패턴:

${parameter//pattern/string}

firstString="I love //Suzi// and Marry"
secondString="Sara"
firstString="${firstString/\/\/Suzi\/\//"$secondString"}"
echo $firstString

, 하다'라고 쓰여 있습니다.I love Sara and Marry

사용 사례에 가장 깔끔한 폼이라고 생각합니다.

firstString="${firstString//Suzi/$secondString}"

이것을 시험해 보세요.

ls *.ext | awk '{print "mv "$1" "$1".newext"}' | sed "s/.ext.newext/.newext/" | parallel {}

위의 awk 솔루션을 기반으로 awk 변수를 사용하도록 확장합니다.이렇게 하면 특수 문자가 포함된 텍스트를 전달할 수 있습니다.

aString="I love _p1_ very much!"
aVar="complicated \" text \' with \. special ) chars"
awk -v p1="$aVar" '{gsub("_p1_",p1); print}' <<< $aString

생산:

I love complicated " text ' with . special ) chars very much

, 이 경우로 합니다.sed -e ★★★★★★★★★★★★★★★★★」bash★★★★★★ 。

제가 찾은 유일한 방법은 문자열을 파일에 저장하고 sed를 사용하여 파일 내용을 var에 저장하는 것입니다.

echo "I love Suzy" > tmp.txt
sed -i "s/Suzy/Sarah/" tmp.txt
set res=`cat tmp.txt`
echo $res
rm tmp.txt

수 ('), 한 'sh'의 'sh'의 'sh-4'와 은 모두 2밖에 발견되지 않음) 심플한 구문은 모두 실패합니다.test=${test2}: 시 (해야 합니다.2번 사용: (사용할 필요가 있습니다)set) at 、 ) ) 。${}.

「」를 사용합니다.sed 할 수

sed -i "s+$value_to_be_replaced+$with_variable1 "some character" $with_variable2+g" $file_name

언급URL : https://stackoverflow.com/questions/13210880/replace-one-substring-for-another-string-in-shell-script

반응형