쉘 스크립트나 Linux를 사용하여 현재 디렉터리에 있는 여러 파일의 내용을 찾고 바꾸는 방법은 무엇입니까?

쉘 스크립트나 Linux를 사용하여 현재 디렉터리에 있는 여러 파일의 내용을 찾고 바꾸는 방법은 무엇입니까?

내 현재 폴더 이름은 다음 과 같은 details1파일 목록이 포함되어 있습니다.file1file2file3

예: (여기서는 이것만 표시했습니다. file1다른 파일에도 동일한 내용이 포함됩니다 file1.)

file1:cat file1

 href="/de_hecklist/secry/GD/GD10/"

 href="/de_hecklist/secry/GT/GT1/"

내 쿼리:

현재 디렉터리(예: file1, file2file3)에서 여러 파일을 찾아서 바꾸는 방법을 사용하여 각 파일을 열지 않고 한 번에 각 파일을 바꾸는 방법입니다.

나는 다음을 시도했습니다. (각 파일을 열면 적용됩니다)

:%s/de_hecklist/data/g

:%s/secry/send/g

현재 디렉터리에 여러 파일이 있는 경우 예외 출력은 다음과 같아야 합니다.

href="/data/send/GD/GD10/"

href="/data/send/GT/GT1/"

답변1

이 줄이 올바른 출력을 제공하는 경우

 sed -e 's/de_hecklist/data/g' -e 's/secry/send/g' file1

in-place그러면 내용을 변경할 수 있습니다.-i

 sed -i -e 's/de_hecklist/data/g' -e 's/secry/send/g' file1

일치하는 모든 파일에 대해 이 작업을 수행하려면 다음을 수행 file?하십시오.

find . -name 'file?' -type f -exec sed -i -e 's/de_hecklist/data/g' -e 's/secry/send/g' {} \;

sed모든 파일을 매개변수로 전달할 수도 있습니다 . 먼저 모든 전체 경로 파일 이름을 제공하는 명령을 만듭니다.

find . -name 'file?' -type f

그런 다음 다음에 추가하십시오 sed.

sed -i -e 's/de_hecklist/data/g' -e 's/secry/send/g' $(find . -name 'file?' -type f) 

답변2

이 시도:

find -maxdepth 1 -type f -name "file?" -exec sed -i.bak -e 's/de_hecklist/data/g; s/secry/send/g' {} +

-name "file?"파일과 일치하는 패턴으로 바꾸거나 완전히 제거하여 모든 파일을 편집할 수 있습니다 .

하위 디렉터리가 입력되지 않아 현재 디렉터리에서 일치하는 파일만 변경됨을 나타 -maxdepth 1냅니다 find.file?

-i.baksed파일을 백업 할 수 있는 옵션이 있습니다 . 백업이 필요하지 않은 경우 삭제할 수 있습니다. 또한 이 -i( --in-place) 옵션은 GNU sed확장이므로 POSIX와 호환되지 않지만 Linux를 사용하고 있으므로 문제가 되지 않습니다.

관련 정보