sed 명령은 매개변수가 너무 길다는 것을 보여줍니다.

sed 명령은 매개변수가 너무 길다는 것을 보여줍니다.

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목록이 너무 깁니다. 이는 sedOR의 문제 가 아니라 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/' {}" \;

관련 정보