파일 내용을 더 쉽게 일괄 변경할 수 있도록 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
, 하지만인용하다, 확실히.