str1
현재 디렉토리에 있는 파일의 모든 문자열을 str2
.I 로 바꾸고 싶습니다 .
sed -i s/str1/str2/g `grep str1 -rl ./`
명령 또는
sed -i s/str1/str2/g `grep str1 -rl --include="*.*" ./`
매개변수가 너무 김 오류가 발생했습니다. 누구든지 이유를 말해 줄 수 있습니까? 나는 이 명령을 구글링했다. sed
그리고 의 소개 도 읽어봤는데 grep
아무 문제가 없다고 느꼈습니다.
답변1
grep str1 -rl .
포함 생성 str1
목록이 너무 깁니다. 이는 sed
OR의 문제 가 아니라 grep
시스템이 매개변수에 제공하는 공간의 양에 대한 문제입니다. ㅏ논의하다"매개변수 목록이 너무 김" 오류에 대한 정보는 동일한 포럼에서 찾을 수 있습니다.
이 문제를 해결하는 한 가지 방법은 다음과 같습니다 xargs
.
grep -rl str1 . | xargs sed -i 's/str1/str2/'
xargs
입력을 받고 sed
전체 입력 중 적절한 크기의 부분을 사용하여 호출을 반복합니다.
공백, ";", "|" 및 기타 특수 문자 등이 포함된 이상한 파일 이름이 있는지 알 수 없으므로 다음과 같은 방법이 더 좋습니다.
find . -type f -exec sed -i 's/str1/str2/' {} \;
find
모든 일반 파일을 반복하고 파일에 다음이 포함된 경우 교체를 수행합니다.문자열 1. grep
파일에 포함되어 있는지 확인하기 위해 호출됩니다 .문자열 1매우 낭비적입니다.
원래 질문과 마찬가지로 이러한 솔루션에서는 모든 파일을 처리할 수 있다고 가정합니다 sed
. 즉, 텍스트 파일입니다. 확실하지 않은 경우 이 코드는 sed
파일이 텍스트 파일인지 확인한 후에만 실행됩니다.
find . -type f -exec sh -c "file {} | grep -q text && sed -i 's/str1/str2/' {}" \;