찾기 및 xargs가 작동하지 않는 것으로 검색하고 바꾸기

찾기 및 xargs가 작동하지 않는 것으로 검색하고 바꾸기

대상 폴더 및 하위 폴더에 있는 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 foohttps://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.
  • seds명령 에 있는 정규식이나 대체 항목에 가 포함된 경우 백슬래시를 /사용하여 이스케이프해야 하는 것보다 다른 문자를 구분 기호로 사용하는 것이 더 쉽습니다 /. 이로 인해 읽기가 매우 어렵습니다. 따라서 .s|regexp|replacement|g​ 나는 그것이 읽기 쉬운 코드를 만드는 것을 s/regexp/replacement/g좋아합니다 . / 에서는 별도의 명령 으로 |사용할 수 없다는 단점이 있습니다 (확장 정규식 연산자이기도 함).exvis/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

관련 정보