나는 다음을 생각했습니다.
xx=abc ; echo "abcde-123" | sed -e s/$xx/$xx_nnn/g
로 이어질 것입니다 abcde_nnn123
. 그러나 결과는 입니다.
독일어-123
보시다시피 접두사 xx=abc
가 제거되고 _nnn
교체 패턴이 완전히 무시됩니다. 왜 이런 일이 발생합니까?
답변1
여기서 가장 큰 문제는 실제로 존재하지 않는 변수를 /$xx_nnn/
전달하고 있다는 것입니다 . $xx_nnn
따라서 기본적으로 다음을 실행하고 있습니다.
xx=abc ; echo "abcde-123" | sed -e s/$xx//g
#or what is equivalent:
echo "abcde-123" | sed -e s/abc//g
그래서 당신은 다음을 얻습니다: de-123
, 당신은 abc
아무것도 대체하지 않습니다.
가장 좋은 해결책은 다음을 사용하는 것입니다. ${varname}
예를 들면 다음과 같습니다.
xx=abc ; echo "abcde-123" | sed -e "s/$xx/${xx}_nnn/g"
다음에 나오는 모든 내용은 }
변수 이름의 일부가 아닙니다.
에 대한:
결과는 abcde_nnn123입니다.
그런 결과는 아닐 겁니다. sed
제공한 명령을 사용하면 다음을 얻을 수 있습니다.
abc_nnnde-123
따라서 정말로 다음을 얻고 싶다면 abcde_nnn123
코드는 다음과 같아야 합니다.
xx=abcde ; echo "abcde123" | sed -e "s/$xx/${xx}_nnn/g"
다음을 사용하여 문자열을 바꿀 수도 있습니다.Bash 매개변수 확장. 예를 들어:
str='abcde123'
xx='abcde'
echo "${str/$xx/${xx}_nnn}" # means: in 'abcde123' replace 'abcde'
#with `abcde_nnn`