값 찾기 및 바꾸기를 위한 일반 sed 명령

값 찾기 및 바꾸기를 위한 일반 sed 명령

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//|/\\|}|"

관련 정보