대상 폴더 및 하위 폴더에 있는 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 {} +
하거나 GNU 확장 과xargs -r0
함께 NUL로 구분된 레코드를 사용하는 것이 더 좋습니다.-r
-0
sed -i
메타데이터 정보가 손실될 수 있는 원본의 수정된 복사본으로 파일을 대체하므로 수정되지 않을 파일에서 실행을 피하는 것이 가장 좋습니다. 따라서 목록grep -lZ
(NUL로 구분되어 정규식과 일치하는 행이 하나 이상 있는 파일 중 )-Z
에서 사용됩니다 .xargs -0
:
정규식 연산자가 아니므로 이스케이프할 필요가 없습니다. 일치\:
항목은 POSIX에서 지정되지 않았으며 대부분의sed
구현에서 문서화되지 않았습니다. 따라서 현재는 구현에서 일치할 수 있지만:
미래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'
참고*: 이는 다음을 대체합니다.test.com~와 함께set.com