답변:
처음 나타나는 패턴을 주어진 문자열로 바꾸려면 다음을 사용하십시오 .${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 "매개 변수 확장"을 참조하십시오 .
\n
그 맥락에서 개행 문자가 아니라 자체를 나타 내기 때문 입니다. 나는 현재 테스트하기에 Bash를 가지고 있지 않지만, 당신은 다음과 같은 것을 쓸 수 있어야한다 $STRING="${STRING/$'\n'/<br />}"
. (아마도 STRING//
-대신에 STRING/
echo ${my string foo/foo/bar}
. 당신은 필요합니다input="my string foo"; echo ${input/foo/bar}
//
직접 언급하는 대신 " 패턴 이 ' /
'로 시작 하는 경우 '가 어떻게 발생하는지 언급합니다 (이 문장의 나머지 /
부분은 실제로는 패턴)-하지만 더 나은 소스를 모릅니다.
이것은 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/")
result=$(echo $firstString | sed "s/Suzi/$secondString/g")
echo
인수 주위에 누락 된 따옴표를 추가했습니다 . 간단한 문자열로 인용하지 않고 기만적으로 작동하지만 사소하지 않은 입력 문자열 (불규칙한 간격, 쉘 메타 문자 등)을 쉽게 끊습니다.
이 시도:
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
이 필수 인 경우 모든 문자 를 피 하십시오 .
sed
과 함께 사용하지 못하게했습니다 . Bash는 마술 변수보다 문자열 대체를 위해 명령의 출력을 사용하는보다 일반적인 방법을 제공합니까? 귀하의 코드 는 Bash가 $ HOME으로 확장하지 못하게하기 위해 를 피해야 했습니다. 또한 명령에서의 기능은 무엇입니까? pwd
$PS1
~
#
~
: 내가 물건을 어떻게 인용했는지 주목하십시오. 항상 물건을 인용하십시오! 그리고 이것은 마법 변수에 대해서만 작동하지 않습니다. 모든 변수는 bash 내에서 문자열 길이 등을 대체하고 대체 할 수 있습니다. $PS1
빠른 노력을 축하합니다 . $PROMPT_COMMAND
다른 프로그래밍 언어에 더 익숙하고 컴파일 된 프롬프트를 코딩하려는 경우 에도 관심이 있을 수 있습니다.
echo "${PWD/#$HOME/~}"
my를 $HOME
으로 바꾸지 마십시오 ~
. 교체 ~
와 함께 \~
또는 '~'
작동합니다. 이 중 하나는 다른 배포판의 Bash 4.2.53에서 작동합니다. ~
호환성을 높이기 위해 게시물을 업데이트하거나 인용하지 않으시겠습니까? "매직 변수"질문의 의미는 다음과 같습니다. 예를 들어, uname
변수로 변수를 먼저 저장하지 않고 Bash의 변수 대체를 사용할 수 있습니까 ? 내 개인에 관해서는 $PROMPT_COMMAND
, 그것은 복잡 .
댓글을 추가 할 수 없으므로 @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}
Roman Kazanovskyi 의 답변 과 달리 순수 POSIX 셸 방법은 외부 도구가 필요하지 않으며 셸 자체 고유 매개 변수 확장 입니다. 긴 파일 이름이 최소화되므로 코드가 한 줄에 더 적합합니다.sed
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 love
Suzi and Marry
그러나 경우 t=Zelda
, 다음 "${f%$t*}"
아무 것도 삭제하지 않고, 전체 문자열을 "반환 I love Suzi and Marry
".
경우에 테스트하는 데 사용됩니다 $t
에 $f
와 [ "${f%$t*}" != "$f" ]
로 평가되는 사실 경우 $f
문자열이 "포함 Suzi*
"과 거짓 이 아니라면.
테스트가 true를 반환하면 가장 작은 접미사 패턴 제거${f%$t*}
" I love
"와 가장 작은 접두사 패턴 제거 ${f#*$t}
" and Marry
"를 사용하여 두 번째 문자열 $s
" Sara
"을 사이에 두고 원하는 문자열을 구성 하십시오 .
나는 이것이 오래되었다는 것을 알고 있지만 아무도 awk 사용에 대해 언급하지 않았기 때문에 :
firstString="I love Suzi and Marry"
echo $firstString | awk '{gsub("Suzi","Sara"); print}'
echo [string] | sed "s/[original]/[target]/g"