스크립트에서 이러한 명령을 실행하면
#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla
그것은 괜찮습니다.
그러나 내가 달리면 :
#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'
튜토리얼에서 쉘에서 환경 변수를 대체하고 중지 해야하는 $varname
부분을 인용하여 직접 대체하지 않도록 부품을 인용 합니다. 이것은 내가 한 일이며 변수가 바로 정의 된 경우에만 작동합니다.
$var
쉘에 정의 된 환경 변수로 sed를 어떻게 인식 할 수 있습니까?
답변
두 예제가 동일 해 보이므로 문제를 진단하기가 어렵습니다. 잠재적 인 문제 :
-
다음과 같이 큰 따옴표가 필요할 수 있습니다.
sed 's/xxx/'"$PWD"'/'
-
$PWD
슬래시를 포함 할 수 있으며,이 경우 구분자로 사용하기 위해 포함 되지 않은 문자를 찾아야합니다$PWD
.
한 번에 두 문제를 모두 해결하려면
sed 's@xxx@'"$PWD"'@'
답변
Norman Ramsey의 답변 외에도 전체 문자열을 큰 따옴표로 묶을 수 있습니다 (문을 더 읽기 쉽고 오류가 덜 발생하게 만들 수 있음).
따라서 ‘foo’를 검색하여 $ BAR의 내용으로 바꾸려면 sed 명령을 큰 따옴표로 묶을 수 있습니다.
sed 's/foo/$BAR/g'
sed "s/foo/$BAR/g"
첫 번째, $ BAR은 올바르게 확장되지 않지만 두 번째 $ BAR은 올바르게 확장됩니다.
답변
“/”이외의 다른 문자를 대신 사용할 수 있습니다.
sed "s#$1#$2#g" -i FILE
답변
또 다른 쉬운 대안 :
때문에 $PWD
일반적으로 슬래시를 포함 /
, 사용 |
대신 /
나오지 문 :
sed -e "s|xxx|$PWD|"
답변
질문을 편집하면 문제가 발생합니다. 현재 디렉토리가 /home/yourname
…이 경우 아래 명령 이라고 가정 해 봅시다 .
sed 's/xxx/'$PWD'/'
로 확장됩니다
sed `s/xxx//home/yourname//
유효하지 않습니다. 이렇게하려면 $ PWD에서 \
각 문자 앞에 문자 를 넣어야합니다 /
.
답변
나쁜 방법 : 구분 기호 변경
sed 's/xxx/'"$PWD"'/'
sed 's:xxx:'"$PWD"':'
sed 's@xxx@'"$PWD"'@'
아마 최종 답변이 아닌 사람들은
$PWD
, /
:
OR 에서 어떤 캐릭터가 나타날지 알 수 없습니다 @
.
좋은 방법은의 특수 문자를 바꾸는 것입니다 $PWD
.
좋은 방법 : 탈출 구분 기호
예를 들어 : URL
$ url 로 바꾸십시오 ( :
/
내용이 있음).
x.com:80/aa/bb/aa.js
문자열 $ tmp에서
<a href="URL">URL</a>
ㅏ. /
구분자로 사용
echo ${url//\//\\/}
x.com:80\/aa\/bb\/aa.js
echo ${url//\//\/}
x.com:80/aa/bb/aa.js
echo "${url//\//\/}"
x.com:80\/aa\/bb\/aa.js
echo $tmp | sed "s/URL/${url//\//\\/}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
echo $tmp | sed "s/URL/${url//\//\/}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
또는
비. :
구분 기호로 사용 (보다 읽기 쉬운 /
)
echo ${url//:/\:}
x.com:80/aa/bb/aa.js
echo "${url//:/\:}"
x.com\:80/aa/bb/aa.js
echo $tmp | sed "s:URL:${url//:/\:}:g"
<a href="x.com:80/aa/bb/aa.js">x.com:80/aa/bb/aa.js</a>
답변
실제로 가장 간단한 방법은 적어도 sed replacement (s) 명령에 다른 구분 기호를 사용하는 것입니다. 따라서 s / pattern / ‘$ mypath’/를 s / pattern // my / path /로 확장하는 대신 s 명령을 혼동 시키려면 s! pattern! ‘$ mypath’를 사용하십시오! s! pattern! / my / path로 확장됩니다! 나는 Bang (!) 문자 (또는 원하는 것을 사용)를 사용하여 일반적인 구분을 의미하지만 슬래시를 구분 기호로 사용하지 않습니다.