2016-08-25 1 views
3

bash를 사용하면 A이라는 특정 문자열이 포함 된 파일에서만 bash를 사용하여 대체 문자 (BC으로 바꿉니다)를 대체하려고합니다.특정 문자열을 포함하는 파일에만 sed 호출 - 파일 이름에 공백 문자와 함께 문제가 발생했습니다.

for FILE in `grep -Rl "A" | tr " " "@"`; 
    do F1=`echo $FILE | tr "@" " "`;sed 's/B/C/' "$F1"; 
done 
:

내가

grep -Rl "A" | xargs sed -i 's/B/C' 

을 시도하지만 파일 이름이 공백 못생긴 해결 방법으로

를 포함 할 때이 오류가 발생, 나는 자리로 공백을 대체하는 다음과 같은 솔루션 함께했다

더 멋진 솔루션이 있습니까?

+0

http://stackoverflow.com/q/15976570/2908724 – bishop

답변

2

당신은 xargs에 대한 grep-0에 대한 --null를 사용할 수 있습니다

grep 명령 xargs -0가 null xargs에 입력을 종료 읽기의 각 파일 이름 뒤에
grep --null -Rl 'A' . | xargs -0 sed -i '' 's/B/C/' 

--null 출력 0 바이트 (아스키 NUL 문자).

1

grep에 대해 --null 인수를 xargs에 -0 인수와 결합하여 인수를 NUL 문자로 구분할 수 있습니다.

man grep: 
--null Prints a zero-byte after the file name. 

man xargs: 
-0  Change xargs to expect NUL (``\0'') characters as separators, 
     instead of spaces and newlines. This is expected to be used in 
     concert with the -print0 function in find(1). 
1

파일을 찾을 수있는 UNIX 도구는하지 grepfind 적절 충분히 지정됩니다.

find . -type f -exec grep -l -Z 'A' {} + | 
xargs -0 sed -i 's/B/C' 
+0

감사합니다. 당연히 나는 find를 알고 있지만, 당신의 솔루션은 grep을 사용한다. (따라서 2 대신에 3 개의 툴을 사용한다.) 또한 해결책을 찾았지만 grep에는 -Z, xargs에는 공백을 처리하는 -0이 없어서 작동하지 못했습니다. grep 대신 find를 사용하면 내 질문에 답할 수 없습니다 ... –

+0

grep을 사용하지 않겠다는 말을 들었습니다. 파일을 찾기 위해'find '를 사용하고 파일을 찾기 위해'grep'을 사용했습니다. p '파일을 찾습니다. 네,이 경우 3 개 도구가 2보다 낫습니다. GNU 사람들은 grep에 파일 찾기 기능을 제공 할 때 각 도구의 유닉스 철학에 반대했습니다. (출력을 정렬하기위한 다음 옵션은 무엇입니까? GNU grep은 혼란스러운 비논리적인 논쟁의 일부일뿐입니다. 어떻게하면 GNU grep 옵션'-R'을 사용할 때 GNU grep과 xargs 옵션이 누락 된 파일 이름에 누락 될 수 있습니까? –

관련 문제