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