![sed를 사용하여 접미사 추가: 두 번째 사용 시 변수가 무시되는 이유는 무엇입니까?](https://linux55.com/image/211754/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%A0%91%EB%AF%B8%EC%82%AC%20%EC%B6%94%EA%B0%80%3A%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%EC%82%AC%EC%9A%A9%20%EC%8B%9C%20%EB%B3%80%EC%88%98%EA%B0%80%20%EB%AC%B4%EC%8B%9C%EB%90%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 다음을 생각했습니다.
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`