내 스크립트에 문제가 있습니다. 그 목적은 호출된 파일의 값을 %DIR%
경로명이 되도록 변경하는 것입니다. 문제는 디렉토리 이름의 슬래시가 sed를 엉망으로 만들어서 이상한 오류가 발생한다는 것입니다. 경로 이름의 슬래시를 이스케이프 슬래시로 변환해야 합니다.
그래서 /var/www
그것은 될 것입니다\/var\/www
하지만 어떻게 해야할지 모르겠습니다.
스크립트가 sed를 실행하는 현재 방식은 다음과 같습니다.
sed -i "s/%DIR%/$directory/g" "$config"
답변1
Bash를 사용한다고 말했으므로 다음을 사용할 수 있습니다.매개변수 확장슬래시 삽입:
$ directory=/var/www
$ echo "${directory//\//\\/}"
\/var\/www
이는 다음과 같이 분류됩니다.
- 바꾸다
directory
- 각각 교체 (
//
) - 슬래시(
\/
) - 그리고(
/
) - 백슬래시+슬래시(
\\/
).
이것을 sed 명령에 넣으면 다음이 제공됩니다.
sed -i "s/%DIR%/${directory//\//\\/}/g" "$config"
답변2
/
여기에 있는 다른 답변은 이미 훌륭하지만 with 외에 다른 구분 기호를 사용할 수 있다는 점을 추가하고 싶었습니다 sed
. 다음을 포함하는 입력을 조작해야 할 때마다 /
:
sed -i "s@%DIR%@${directory}@g" "$config"
심지어:
sed -i "s#%DIR%#${directory}#g" "$config"
모두 동일합니다 . 나중에 구분 기호로 sed
지정하는 문자를 사용합니다 .s
답변3
매개변수 확장/대체 사용:
${directory////\\/}
설명하다
${directory // / / \\/}
^ ^ ^ ^
| | | |
| | | replacement, backslash needs to be backslashed
| | delimiter
| string
global
substitution
답변4
bash에서 제공하는 문자열 조작 기능을 사용할 수 있습니다.매개변수 확장, 특히 형태. 이 문자만 바꿔야 하는 것은 아닙니다. 문자 , , 개행 문자 및 구분 기호 앞에는 백슬래시를 붙여야 합니다.${VARIABLE//PATTERN/REPLACEMENT}
/
s
\
&
s
replacement=$directory
replacement=${replacement//\\/\\\\}
replacement=${replacement//\//\\/}
replacement=${replacement//&/\\&}
replacement=${replacement//$'\n'/\\$'\n'}
sed -i "s/%DIR%/$replacement/g" -- "$config"
또는 awk 또는 Perl과 같은 참조가 필요하지 않은 도구를 사용하십시오.
directory=$directory awk '{gsub(/%DIR%/, ENVIRON["directory"])} 1' <"$config" >"$config.new" &&
mv -- "$config.new" "$config"
또는
directory=$directory perl -i -pe 's/%DIR%/$ENV{directory}/g' "$config"