sed를 사용하여 문자열을 다른 문자열로 바꾸는 방법이 있습니까? sed는 찾기 및 바꾸기 표현식에 구분 기호를 사용하기 때문에 다른 문자열을 모든 경로의 모든 문자(또는 모든 문자)로 바꿀 수 있는 sed 명령을 작성하는 방법을 찾을 수 없습니다(여기에는 모든 문자가 포함될 수도 있음).
다음은 작동하지 않는 것의 예입니다.
new_value="foobar"
old_value="baz"
echo "$some_path" | sed -e "s|$old_value|$new_value|"
이 명령은 파이프가 없거나 파이프를 포함하지 않는 $new_value
한 유효합니다 $old_value
. 이 경우 대체 구문이 sed 표현식에 사용된 변수에 의해 손상되기 때문에 명령이 아무런 효과가 없습니다.
sed를 사용하여 문자열을 다른 문자열로 바꾸는 방법이 있습니까?
그렇지 않다면 Unix에 대한 좋은 대안이 있습니까?
답변1
이 문제를 해결하는 간단한 방법은 다음을 호출하기 전에 변수의 모든 것을 이스케이프하는 것입니다 sed
.
new_value="foo|bar"
old_value="ba|z"
new_value=$(printf '%q' "$new_value")
old_value=$(printf '%q' "$old_value")
some_path="/path/to/ba|z/file"
그런 다음:
$ echo "$some_path" | sed -e "s|$old_value|$new_value|"
/path/to/foo|bar/file
여기서의 요령은 printf '%q'
다음과 같습니다 help printf
(bash 내장 도움말 표시 printf
).
%q quote the argument in a way that can be reused as shell input
답변2
쉘 매개변수 대체를 사용하여 필수 문자를 이스케이프할 수 있습니다.
sed -e "s|${old_value//|/\\|}|${new_value//|/\\|}|"