sed 대체와 함께 LHS 및 RHS에서 변수를 사용하는 방법은 무엇입니까?

sed 대체와 함께 LHS 및 RHS에서 변수를 사용하는 방법은 무엇입니까?

나하고 싶어:

cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh

내 프로그램에서.

하지만 다음과 같은 변수를 사용하고 싶습니다.

old_run='old_name_952'
new_run='old_name_953'

사용해 보았지만 교체가 발생하지 않습니다(오류 없음). 나는 시도했다:

cat update_via_sed.sh | sed 's/old_run/new_run/'
cat update_via_sed.sh | sed 's/$old_run/$new_run/'
cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'

답변1

다음을 수행할 수 있습니다.

sed "s/$old_run/$new_run/" < infile > outfile

그러나 이는 $old_run정규 표현식으로 처리되므로 변수에 포함된 특수 문자(예: /또는 ) 는 다음과 같아야 .합니다.탈출하다. 마찬가지로 에서 $new_run&문자 는 특별한 처리가 필요하며 그 안에 있는 및 개행 문자를 \이스케이프해야 합니다 ./

$old_run또는의 내용이 $new_run귀하의 통제하에 있지 않은 경우,비판적인탈출을 수행하거나 그렇지 않은 경우이 코드는 코드 삽입 취약점과 동일합니다..

답변2

이것은 작동합니다:

cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/'

나는 동일한 파일을 "재사용"하고 싶기 때문에 비슷한 접근 방식을 원하는 모든 사람을 위해 실제로 이것을 사용합니다.

cat update_via_sed.sh | sed 's/'"$old_run"'/'"$new_run"'/' > new_update; mv -f new_update update_via_sed.sh

위의 명령은 새 파일을 만든 다음 현재 파일을 삭제하고 새 파일의 이름을 현재 파일로 바꿉니다.

답변3

큰따옴표(작은따옴표 아님) 안에 있는 한 sed에서 변수를 사용할 수 있습니다.

sed "s/$var/r_str/g" file_name >new_file

/변수에 슬래시( )가 있는 경우 아래와 같이 다른 구분 기호를 사용하십시오.

sed "s|$var|r_str|g" file_name >new_file

답변4

man bash작은따옴표에 대한 정보를 제공합니다.

문자를 작은따옴표로 묶으면 따옴표 안의 각 문자의 리터럴 값이 유지됩니다. 앞에 백슬래시가 있더라도 작은따옴표 사이에는 작은따옴표를 사용할 수 없습니다.

명령줄에 무엇을 입력하든, bash는 이를 해석하고 그 결과를 전송 대상 프로그램으로 보냅니다. 이 경우 sed 's/$old_run/$new_run/'bash를 사용하면 가장 먼저 보게 되는 것은 sed이를 $PATH변수에 존재하는 실행 파일로 인식한다는 것입니다. 실행 sed파일에는 입력이 필요합니다. Bash는 입력을 찾고 's/$old_run/$new_run/'. 작은따옴표는 bash가 내용을 해석하지 않고 있는 그대로 전달한다는 것을 나타냅니다. 그래서 bash는 그것들을 sed에 전달합니다. Sed는 $줄 끝에서만 발생할 수 있기 때문에 오류를 표시합니다 .

반대로, 큰따옴표를 사용하면, 즉 "s/$old_run/$new_run/"bash는 이를 보고 $old_run변수 이름으로 해석하고 대체합니다(이 단계를 변수 확장이라고 합니다). 이것이 실제로 우리에게 필요한 것입니다.

그러나 큰따옴표는 먼저 bash에 의해 해석된 다음 sed에 제공되므로 큰따옴표를 사용할 때 주의해야 합니다. 따라서 일부 기호(` 등)는 사용하기 전에 이스케이프 처리해야 합니다.

관련 정보