sed에서 변수 문자열을 특수 문자로 바꾸는 방법 [중복]

sed에서 변수 문자열을 특수 문자로 바꾸는 방법 [중복]

파일 내용을 더 쉽게 일괄 변경할 수 있도록 sed를 사용하여 파일의 텍스트를 바꾸기 시작했고 필요한 각 값을 BASH의 변수에 설정하고 모든 변수를 호출하여 기존 항목을 바꾸는 함수로 교체를 설정했습니다. 텍스트. 예~

sed -i -e "s/$answer/$FORME $answer/g" ~$answer.txt

$answer 는 터미널에서 명령 입력을 위한 변수입니다. $FORME은 $answer 입력을 기반으로 정의된 변수인데 $FORME에 "/"가 포함되어 있습니다. 온라인에서 검색해 보니 특수 문자가 포함된 변수 대체를 사용하는 방법을 찾을 수 없습니다. 특수 문자를 사용하여 $FORME을 생성하는 $answer에 대한 명령을 사용하려고 하면 다음 오류가 나타납니다.

sed: -e expression #1, char 15: unknown option to `s'

나는 이것이 $FORME의 특수 문자가 대체될 문자열이 아닌 실제 명령의 일부로 등록된다는 것을 의미한다고 가정합니다. 도와주세요!

미리 감사드립니다!

답변1

s명령 구분 기호 로 모든 문자를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

sed -i -e "s|$answer|$FORME $answer|g" ~$answer.txt

답변2

이 질문이 Stack Exchange에서 질문되고 답변되었다는 것은 놀라운 일이지만, 일반적으로 유용한 두 가지 답변은 매우 합법적인 질문에 대해 건초 더미에서 바늘을 찾는 것과 같습니다. 그들은:

1. 변수에서 가능한 특수 문자 4개만 이스케이프하세요.

지적한대로여기(이 질문은 일반적인 질문에 대한 SE의 혐오감의 희생물이지만) sed 명령의 대체 부분에서 특수한 것으로 간주되는 문자는 s, \, &줄 바꿈 및 구분 기호입니다(일반적 /으로 그러나 실제로는 무엇이든 될 수 있음).

따라서 sed에서 임의의 변수를 대체 변수로 사용하려면 먼저 다음과 같이 이 네 문자가 나타나는 것을 모두 이스케이프하세요.

REPL='Arbitrary variable potentially with special characters like / and & and \ and 
newline\
newline2'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
hexdump -C <<< "$REPL"

예를 들어:

REPL='/&\ 
newline'
REPL=$(sed -e 's/[&\\/]/\\&/g; s/$/\\/' -e '$s/\\$//' <<<"$REPL")
sed "s/x/$REPL/" <<< "STARTxEND"

생산하다:

START/&\ 
newlineEND

예상대로.

2. 동등한 도구를 사용하여 대체 변수를 문자 그대로 해석합니다.

perl(인용하다)에는 변수(내보내거나 호출 회선에 설정하여 환경의 일부가 되는 한)가 일급 시민이기 때문에 이 기능이 있습니다. \Q대체 문자열에는 주석이 필요하지 않습니다(그러나 정규식 문자열에는 유용합니다).

export REPL='/&\ 
newline'
perl -pe 's/x/$ENV{REPL}/' <<< "STARTxEND"

생산하다:

START/&\ 
newlineEND

awk, 하지만인용하다, 확실히.

관련 정보