Bash는 sed의 경로 이름을 이스케이프되도록 변환합니다.

Bash는 sed의 경로 이름을 이스케이프되도록 변환합니다.

내 스크립트에 문제가 있습니다. 그 목적은 호출된 파일의 값을 %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"

관련 정보