sed를 사용하여 접미사 추가: 두 번째 사용 시 변수가 무시되는 이유는 무엇입니까?

sed를 사용하여 접미사 추가: 두 번째 사용 시 변수가 무시되는 이유는 무엇입니까?

나는 다음을 생각했습니다.

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`

관련 정보