설명하다:

설명하다:

sed 및 regexp 그룹화에서 널 문자(공백, 탭 등) 교체가 작동하지 않는 이유:

sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"

전체 줄이 파일의 문자열을 대체합니다.

sudo find "${config_path}" -type f -exec sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

문제를 해결하는 방법을 아시나요?

감사해요!

EDIT1: 이제 -r을 사용하면 확장 정규식이 활성화되지만 여전히 대체는 불가능합니다.

sudo find "${config_path}" -type f -exec sed -ir "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

그러나 여전히 교체가 발생하지 않습니다.

편집 2(작업 솔루션): 그룹화에 \( \)를 사용하면 다음과 같이 작동합니다.

sudo find "${config_path}" -type f -exec sed -i "s|dir\(\s*\)=\(\s*\)'${site_path_source}'|dir\1=\2'${site_path_target}'|g" {} \;

그러나 -r 확장 정규 표현식을 사용하는 EDIT1의 솔루션이 작동하지 않는 이유를 이해할 수 없습니다.

편집 3(작업 솔루션 2): -r을 사용하여 확장 정규식을 활성화하면 이제 작동합니다.

sudo find "${config_path}" -type f -exec sed -r -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

설명하다:

  • -i에는 접미사가 필요하므로 "sed -ir SUFFIX"를 사용하면 오류가 발생합니다.
  • -r과 -i를 따로 사용하고, -i 뒤에 접미사가 붙기 때문에 "sed -r -i SUFFIX"를 사용하는 것이 좋다.

답변1

주문하다

sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"

d i r (0개 이상의 공백을 포함하는 줄 찾기 ) = (0개 이상의 공백 ) '등 그룹화를 사용하려는 경우 확장 정규식을 사용 \( \)하거나 활성화해야 합니다.sed -r

$1and 는 처음 두 개의 위치 인수입니다. $2문자열의 첫 번째 그룹과 두 번째 그룹을 일치시키려면 \1and 를 사용해야 합니다 \2.

관련 정보