이렇게 여러 디렉터리의 예제를 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 ...
인쇄를 제공하기 전에 추가하세요 .find
sed
관련된:
답변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은 대신 파일에서 줄을 추출합니다.목록문서.
일치하는 파일 목록을 얻으려면 -l
grep 옵션을 사용하십시오.
$ 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 작업을 수행합니다.
인사