대상 폴더 및 하위 폴더에 있는 html/css 파일의 소스 코드에 있는 URL을 검색하고 바꾸려고 합니다. 다음 명령을 사용해 보았습니다.
find . -type f | xargs sed -i 's/https\:*\.websitedomain\.fr\///g'
내가 무엇을 놓치고 있나요?
어떤 제안이라도 미리 감사드립니다.
답변1
GNU 시스템을 가정합니다(귀하의 사용법 sed -i
에 따르면 이것이 귀하의 경우임):
eregex='https://[^/[:space:]]+\.websitedomain\.fr/'
find . -type f -exec grep -lZEe "$eregex" {} + |
xargs -r0 sed -i -E "s|$eregex||g"
귀하의 접근 방식에 몇 가지 문제가 있습니다.
- 주요한 점은
*
정규식 연산자가 0개 이상의 이전 원자와 일치하므로:*
0개 이상의:
s와 일치한다는 것입니다. 여기서는 공백 및 ( 예를 들어 이것이 일치를 끝내려는 것일 수 있음) 이외의[^/[:space:]]+
1개 이상의 (+
, 확장 정규식 연산자이므로 s) 문자 로 바꿉니다 .-E
/
.*
google.com/ and foo
https://google.com/ and foo.websitedomain.fr/file
- (한 줄에 하나의 파일 경로)의 출력 형식은 (공백 또는 개행 구분 필요, 인용된 단어가 필요함)의 예상 입력 형식과
find -print
호환되지 않습니다 .xargs
출력 형식은find -print
안정적으로 사후 처리할 수 없으며 사람이 소비하는 용도로만 사용됩니다. 을 사용find ... -exec cmd {} +
하거나 NUL로 구분된 레코드를 사용하는 것이 가장 좋습니다xargs -r0
( GNU 확장임)-r
.-0
sed -i
파일을 원본 파일의 수정된 복사본으로 대체하여 메타데이터 정보가 손실될 수 있으므로 수정되지 않는 파일에서 실행하지 않는 것이 가장 좋습니다. 따라서 다음 과 일치 할 수 있도록grep -lZ
목록(NUL로 구분)을 사용하거나 가져옵니다. 정규식 파일과 일치하는 한 줄 이상)을 사용합니다.-Z
xargs -0
:
정규식 연산자가 아니므로 이스케이프가 필요하지 않습니다.\:
일치하는 항목은 POSIX에서 지정하지 않으며sed
대부분의 구현에서 문서화되지 않습니다. 따라서 현재는:
구현에서 a와 일치 할 수 있지만sed
나중에는 변경될 수 있습니다(예:\<
또는\w
처음에 일치<
하고w
결국 최신 버전에서 단어 경계와 단어 문자를 각각 일치시키는 동안).- 명령의 정규식 또는 대체 항목에 가 포함
sed
된 경우 백슬래시 이스케이프를 사용하는 것보다 다른 문자를 구분 기호로 사용하는 것이 더 쉬워 읽기가 어렵습니다. 대신 여기에서는 코드를 더 명확하고 읽기 쉽게 만들기 때문에 마음에 듭니다 . 단점은 / 에서 사용할 수 없고 구분 기호 명령 으로 사용할 수 있다는 것입니다 (확장 정규식 연산자이기도 함).s
/
/
s|regexp|replacement|g
s/regexp/replacement/g
|
ex
vi
s/regex/replacement/
|
ex
답변2
이 시도:
find . -type f | xargs sed -i 's/test\.com/set\.com/g'
포함 여부를 테스트해야 하는 경우https그런 다음 다음을 시도하십시오.
find . -type f | xargs sed -i 's/https\:\\\\test\.com/https\:\\\\set\.com/g'
참고*: 이는 다음을 대체합니다.테스트넷그리고set.com