디렉토리 및 하위 디렉토리에서 sed로 찾기 및 바꾸기


244

이 명령을 실행하여 내 사이트 루트의 모든 파일에서 모든 'apple'을 찾아 'orange'로 바꿉니다.

find ./ -exec sed -i 's/apple/orange/g' {} \;

그러나 하위 디렉토리를 거치지 않습니다.

이 명령에 어떤 문제가 있습니까?

다음은 몇 줄의 출력입니다 find ./.

./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php

find ./샘플 출력 을 실행 하고 게시 할 수 있습니까? 그리고 디렉토리 구조. 편집 : 감사합니다!
Jacob

흠 당신의 발견이 정확하고 하위 디렉토리로 저에게 효과적입니다.
Jacob

1
하위 디렉토리를 처리하지 않는다는 것을 어떻게 알 수 있습니까?
carlpett

sed : 편집 할 수 없음 ./fpd : 일반 파일이 아님 sed : 편집 할 수 없습니다 ./fpd/font : 일반 파일이 아닙니다 sed : ./fpd/font/makefont를 편집 할 수 없습니다 : 규칙이 아님
hd.

아 .. 나는 사과를 먹지 않고 아무것도 찾지 못했다. ;) 감사합니다 . 당신은 내 눈을 뜨고 !!!
hd.

답변:


422

sed에 디렉토리 이름을 보내지 않으려면 다음과 같이 찾으십시오.

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;

19
이 작업 sed -i 's/apple/orange/g'을 수행 sed -i '' 's/apple/orange/g'하기 위해 변경해야 할 수도 있습니다.
paulmelnikow

7
-i임시 파일을 저장하는 데 사용되는 확장자 인 인수를 사용합니다. GNU sed에서는 -i그 사이에 공백이없는 것처럼 보이지만 BSD sed에는 ...가 있습니다. 따라서 BSD -i '' 's/foo/bar/'는 GNU와 같습니다 -i 's/foo/bar/.
paulmelnikow

20
실제로 -eMac OS에서는 추가 가 작동하지 않습니다. touch a b c d e위의 명령은 다음과 같은 디렉토리 목록을 생성합니다 a a-e b b-e c c-e d d-e e e-e.
paulmelnikow

6
Mac OS의 경우 stackoverflow.com/questions/19242275/… 에 응답 합니다.RE error: illegal byte sequence
kakoma

3
피쉬 셸 사용자의 '{}'경우 따옴표가없는 경우 물고기가 빈 괄호를 자동으로 확장하므로 빈 괄호를 인용해야합니다.
Kevin Cherepski

84

더 큰 s & r 작업의 경우 grep 및 xargs를 사용하는 것이 더 빠르고 빠릅니다.

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'

20
이 답변에 감사드립니다. 매우 도움이되었습니다! git 저장소에 있다면git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
mrodrigues

4

이것은 나를 위해 일했다 :

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;

원래 질문은 * .php 파일로 제한되지 않으며, .ini 파일도 있습니다
knocte

인용 부호 *.php가 틀렸다; 당신은 거기에 일치하는 파일이 없기 때문에 시작 디렉토리에서 확장되지 않았기 때문에 운이 좋았습니다.
tripleee

3
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"

1

이 글을 읽는 macOS 사람들도 있기 때문에 (내가했던 것처럼) 다음 코드가 나를 위해 일했습니다 (10.14).

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

macOS에서 사용 -i하고 -e작동하지 않는 다른 모든 답변 .

출처



-6

linuxOS에서 :

sed -i 's/textSerch/textReplace/g' namefile

"sed"가 작동하지 않으면 다음을 시도하십시오.

perl -i -pe 's/textSerch/textReplace/g' namefile

4
그는 서브 디렉토리에서 모든 파일을 찾고 그 문자열을 포함하고 단일 파일뿐만 아니라 바꾸기를
원합니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.