sed 캡처 매개변수

sed 캡처 매개변수

여러 HTML 파일에 나타나는 내용을 바꾸려고 합니다. 새 하위 도메인 이름으로 파일을 업데이트하고 싶습니다.

이전 URL은 다음과 같습니다.

https://123.olddomain.com/wp-content/

새로운 것은 다음과 같아야 합니다:

https://newdomain.com/static/123.newdomain.com/wp-content/

다음 표현식에서 모든 하위 도메인 html 파일을 한 번에 업데이트하려고 합니다.

sudo find . -type f -exec sed -i 's+https:\/\/\([0-9]\).olddomain.com\/wp-content\/+https:\/\/newdomain.com\/static\/$1.newdomain.com\/wp-content\/+g' {} +

$1이 내 r 표현을 포착하지 못하는 것 같습니다. [0-9]

어떤 조언이라도 감사드립니다.

답변1

이런 종류의 문제를 처리하는 관용적인 방법은 쉘 변수를 사용하고 해당 변수가 sed 대체의 왼쪽 또는 오른쪽에 나타나는지 정확하게 인용하는 것입니다.

## make the old var pluggable in the lhs
old='https://123.olddomain.com/wp-content/'
old_lhs=$old
for c in \\ \[ \^ \$ . \* / ;do
old_lhs=${old_lhs//"$c"/\\"$c"}
done

### make the new var pluggable on rhs
new='https://newdomain.com/static/123.newdomain.com/wp-content/'
new_rhs=$new
for c in \\ \& $'\n' /;do
  new_rhs=${new_rhs//"$c"/\\"$c"}
done

## now traverse the tree and detect files
## that have the old domain string in it
# then pass them in multiple chunks to sed
find . -type f \
  -exec grep -qFe "$old" {} \; \
  -exec sed -i -e "s/$old_lhs/$new_rhs/g" {} + \
;

답변2

매우 도움이 되는 모든 제안에 감사드립니다. 마침내 다음 작업을 수행하게 되었습니다.

find . -type f -exec sed -i 's+\([0-9]*\).olddomain.com/wp-content/+\1.newdomain.com/wp-content/+g' {} +

\1하위 도메인에 포함되고 로 식별되는 모든 숫자가 캡처됩니다 \([0-9]*\).

관련 정보