find로 검색하고 바꾸면 xargs가 작동하지 않습니다.

find로 검색하고 바꾸면 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 {} +하거나 NUL로 구분된 레코드를 사용하는 것이 가장 좋습니다 xargs -r0( GNU 확장임) -r.-0
  • sed -i파일을 원본 파일의 수정된 복사본으로 대체하여 메타데이터 정보가 손실될 수 있으므로 수정되지 않는 파일에서 실행하지 않는 것이 가장 좋습니다. 따라서 다음 과 일치 할 수 있도록 grep -lZ목록(NUL로 구분)을 사용하거나 가져옵니다. 정규식 파일과 일치하는 한 줄 이상)을 사용합니다.-Zxargs -0
  • :정규식 연산자가 아니므로 이스케이프가 필요하지 않습니다. \:일치하는 항목은 POSIX에서 지정하지 않으며 sed대부분의 구현에서 문서화되지 않습니다. 따라서 현재는 :구현에서 a와 일치 할 수 있지만 sed나중에는 변경될 수 있습니다(예: \<또는 \w처음에 일치 <하고 w결국 최신 버전에서 단어 경계와 단어 문자를 각각 일치시키는 동안).
  • 명령의 정규식 또는 대체 항목에 가 포함 sed된 경우 백슬래시 이스케이프를 사용하는 것보다 다른 문자를 구분 기호로 사용하는 것이 더 쉬워 읽기가 어렵습니다. 대신 여기에서는 코드를 더 명확하고 읽기 쉽게 만들기 때문에 마음에 듭니다 . 단점은 / 에서 사용할 수 없고 구분 기호 명령 으로 사용할 수 있다는 것입니다 (확장 정규식 연산자이기도 함).s//s|regexp|replacement|gs/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' 

참고*: 이는 다음을 대체합니다.테스트넷그리고set.com

관련 정보