SED로 재귀적으로 교체

SED로 재귀적으로 교체

이렇게 여러 디렉터리의 예제를 grep 및 sed로 재귀적으로 바꾸는 것이 가능합니까?

grep -e "http://localhost:4000" -r ~/dev_web/_site  | sed -e 's/http:\/\/localhost:4000/https:\/\/another_site.com/g'

이 작업을 수행하면 터미널에 완료되었다고 표시되지만 다시 grep하면 다음과 같습니다.

grep -e "https://another_site.com" -r ~/dev_web/_site

파일 4개만 변경했다고 나와요..

내가 이렇게 하면:

 grep -e "http://localhost:4000" -r ~/dev_web/_site/

예 http:localhost:4000은 아직 여기에 있습니다.

답변1

파이프라인이 파일을 변경하지 않았습니다. 정규식과 일치하는 행을 추출한 grep다음 해당 데이터를 변경하지만 파일을 변경하려고 시도하지는 않습니다.

대신 GNU를 가정하면 다음과 같습니다 sed.

find ~/dev_web/_site -type f \
    -exec grep -qF 'http://localhost:4000' {} ';' \
    -exec sed -i 's#http://localhost:4000#https://another.site#g' {} +

그러면 디렉토리 안이나 아래에 있는 모든 일반 파일이 검색됩니다 ~/dev_web/_site. 이러한 각 파일에 대해 grep먼저 파일에 지정된 문자열이 포함되어 있는지 테스트하십시오. 포함된 경우 sed내부 교체를 위해 GNU가 호출됩니다.

grep단계는 생략할 수 있지만 GNU는 sed수정 타임스탬프를 업데이트합니다.모두이에 대한 문서가 없습니다.

아래 디렉토리에 있는 파일의 하위 집합만 보고 싶을 수도 있습니다 ~/dev_web/_site. 이 경우 -name '*.js'다음과 같은 항목(또는 일치시키려는 이름 패턴)으로 검색을 제한하세요 -type f.

-print-exec sed ...인쇄를 제공하기 전에 추가하세요 .findsed

관련된:

답변2

sed 세션은 실제 파일이 아닌 grep의 출력을 위한 것입니다.

파일을 나열하는 데 사용됩니다 grep(*)

grep -e "http://localhost:4000" -r ~/dev_web/_site -l 

그런 다음 그 자리에서 사용 xargs하고 편집하세요.sed -i

xargs sed -i -e 's;http://localhost:4000;https://another_site.com;g'

(btw sed에서 구분 기호를 변경할 수 있습니다)

이제 모두가 함께해요

grep -e "http://localhost:4000" -r ~/dev_web/_site -l |
xargs sed -i -e 's;http://localhost:4000;https://another_site.com;g'

물론 한 줄에 있을 수도 있지만, 파이프 기호( |)를 사용하여 줄을 이어갈 수도 있다는 점에 유의하세요.

(*) 파일 이름에는 공백, 줄 바꿈 및 기타 흥미로운 문자가 없다고 가정합니다.

답변3

첫 번째 grep은 대신 파일에서 줄을 추출합니다.목록문서.
일치하는 파일 목록을 얻으려면 -lgrep 옵션을 사용하십시오.

$ grep -rl "htt...."  ~/dir

sed를 사용하여 파일 수정을 수행하려면 목록을 sed에 제공합니다(순서 반대).

$ sed -e 's#http://localhost:4000#https://another_site.com#g' \
$(grep -rle "http://localhost:4000" ~/dev_web/_site)

공백이나 새 줄이 없는 "깨끗한" 파일 이름을 가정합니다.

더 강력한 옵션은 find를 사용하는 것입니다.

fromname='http://localhost:4000
toname='https://another_site.com'
searchdir=~/dev_web/_site
find "$searchdir" -type f \
    -exec grep -qF "$fromname" {} ';' \
    -exec sed -i 's#'"$fromname"'#'"$toname"'#g' {} +

답변4

나에게 가장 좋은 것은 다음 용도로 사용하는 것입니다.

for i in $(grep -R "string_to_change" | awk -F: '{print $1}');do sed -i 's/string_to_change/string_changed/g' $i ;done

설명: grep -R을 사용하여 문자열을 반복적으로 찾으세요. 항상 이름 앞에 다음을 붙여서 파일 경로를 얻을 수 있습니다. 마지막으로 추출된 파일에 대해 sed 작업을 수행합니다.

인사

관련 정보