여러 파일 내에서 텍스트 찾기 및 바꾸기


답변:


136

여기서는 sed를 사용하여 / home / user / directory / 디렉토리에 확장자 c가있는 모든 파일에서 "cybernetnews"라는 단어를 "cybernet"으로 바꿉니다.

find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;

실행 디렉토리에서 재귀 적으로 검색하고 읽기 쉽고 쓰기 가능한 일반 파일에서만 작동하는보다 일반적인 변형 :

find ./ -type f -readable -writable -exec sed -i "s/cybernetnews/cybernet/g" {} \;

2
그것은 효율적인 방법이기 때문에 이것을 투표
Sabacon

4
; 나오지는 최선의 선택이 IMO,하지만 당신은 대답의 구성 요소를 설명하면 응답을 더 유용 할 수 있기 때문에 최대 투표 (개인적를, 나는 {} \에 대해 잘 알고 호기심이 아니에요)
세쿼이아 맥도웰

5
트윗 담아 가기 나는 이것을 놓쳤다! 죄송합니다. 중괄호는 기본적으로 "각 일치"를 의미하며 이스케이프 된 세미콜론 (\;)은 이중 구문 분석을 방지하는 것입니다. 우리는 bourne 호환 쉘과 sed가 명령을 구문 분석하려고하지 않고 sed를 원하지 않습니다.

@Christopher 단어에 공백이 포함되어 있으면 어떻게 작동 cyber net news합니까? 이것을 어떻게로 변환 할 수 cyber net있습니까?
Khurshid Alam

1
@KhurshidAlam -e 스위치와 함께 문자 클래스를 사용하십시오.sed -i -e "s/cyber\snet\snews/cyber net/g"

27

sed 스트림 편집기는 이런 종류의 작업을위한 강력한 유틸리티이며 나의 첫 번째 선택이지만 Ubuntu 기반 기본 응용 프로그램을 사용하여 일반 텍스트 편집기 에서이 작업을 수행하려면 Jedit를 살펴 보는 것이 좋습니다. , 저장소에서 사용 가능하며 콘솔에 입력하여 설치할 수 있습니다.

sudo apt-get install jedit

jedit를 시작하고 검색 메뉴 항목을 클릭 한 다음 메뉴 목록에서 Search in Directory 항목을 클릭하면 아래 대화 상자가 나타납니다.

폴더에서 Jedit 검색 대화 상자

이것은 메모장 ++의 그것과 유사하며 똑같은 일을합니다. 나는 이것이 당신이 원하는 것이라고 생각합니다.


이것은 전체 코드 줄을 검색 할 때 완벽했으며을 사용하여 모든 정규 표현식 특수 문자를 탈출하는 것을 주저했습니다 sed.
IQAndreas

html, javascript 등과 같은 코드 블록을 몇 초 안에 바꿀 수 있습니다.
lepe

이것은 많은 파일에서 작동하지 않지만 몇 시간 후에 한 번의 교체가 이루어지지 않았지만 geany는 모든 발생을 찾기 위해 몇 분이 걸렸습니다. 이것은 효율적인 검색 및 교체가 아닐 수 있지만 방을 멋지게 예열했습니다.
Mark Aroni

19

다른 GUI 옵션은 regexxer입니다 . regexxer 스크린 샷


완벽하게 작동합니다 (Regex에 이미 익숙한 경우). 감사합니다.
어니스트

1
심지어 정규 표현식을 모르는 경우이 도구를 간단한 문자열 검색 및 바꾸기 도구로 사용할 수 있으며 정규 표현식이나 다른 작업이 필요하지 않습니다.
Mohd Abdul Mujib

13
perl -pi -e 's/oldtext/newtext/g' *

현재 폴더의 모든 파일에서 oldtext를 newtext로 바꿉니다. 그러나 백 슬래시를 사용하여 oldtext 및 newtext 내의 모든 perl 특수 문자를 이스케이프해야합니다.


9

Geany로 확인하면 Linux를위한 완벽한 NPP 교체입니다. 정확하게 할 수 있고 정규 표현식을 사용할 수 있습니다.


나는 Geany를 사랑합니다! 내가 가장 좋아하는 편집기이며 충분히 강력합니다.
Pisu

1
내가 알 수있는 한 Geany 1.23.1 (Ubuntu 13.10으로 패키지)은 정규식을 사용하여 여러 파일을 검색 할 수는 있지만 대체 할 수는 없습니다.
Drew Noakes

Geany에서 여러 파일을 모두 연 다음 검색 / 바꾸기 대화 상자의 "세션에서"버튼을 사용하면 여러 파일을 검색하고 바꿀 수 있습니다.
MV.

1
메시지 탭에 나열된 5000 파일을 어떻게 열 수 있습니까?
Mark Aroni

1
좋아, regexxer는 내가 요구했던 것과 거의 비슷했다. 나는 정규 표현식을 사용하는 이름 때문에 이전에 건너 뛰었고 정규 표현식과 관련이있는 것을 피하는 경향이있다. 그러나 나는 틀렸다. 도구에는 검색과 교체에 필요한 것이 정확히있다.
Mohd 압둘 무지 브


2

이 스크립트를 사용하여 코드를 복사하고 파일을 만들 수 있습니다 find_and_replace_in_files.sh.

나는 그것을 약간 수정했다. 당신의 의견을 말 해주세요.

# *****************************************************************************************
# find_and_replace_in_files.sh
# This script does a recursive, case sensitive directory search and replace of files
# To make a case insensitive search replace, use the -i switch in the grep call
# uses a startdirectory parameter so that you can run it outside of specified directory - else this script will modify itself!
# *****************************************************************************************

!/bin/bash
# **************** Change Variables Here ************
startdirectory="/your/start/directory"
searchterm="test"
replaceterm="test=ok!"
# **********************************************************

echo "***************************************************"
echo "* Search and Replace in Files Version 01-Aug-2012 *"
echo "***************************************************"

i=0; 

  for file in $(grep -l -R $searchterm $startdirectory)
    do
      cp $file $file.bak
      sed -e "s/$searchterm/$replaceterm/ig" $file > tempfile.tmp
      mv tempfile.tmp $file

    let i++;

      echo "Modified: " $file
    done

echo " *** All Done! *** Modified files:" $i

2

또 다른 프로그램은 Searchmonkey 입니다.

SearchMonkey는 번거로운 찾기 / 그립을 매끄러운 사용자 인터페이스로 대체하여 위치 및 텍스트 일치 수량을 표시하는 마크 업을 신속하게 제공하는 경량 Gtk 애플리케이션입니다. 최종 사용자와 소프트웨어 개발자 모두에게 사용하기 쉽고 액세스하기 쉬운 검색 도구를 제공하는 것이 목표입니다.


2
find . -name "*.txt" |xargs sed -i "s/searched_Text/replacement_Text/g"

페도라에서 나를 위해 일합니다.


당신은이 이상 향상하는 방법을 설명하는 라인을 추가 할 수 있습니다 askubuntu.com/a/84013/158442
muru

@muru 훨씬 적은 sed인스턴스를 실행 합니다! 따라서 CPU 시간 측면에서 훨씬 빠릅니다. 파일 액세스 시간이 제한적이므로 클럭 시간이 훨씬 빠르지는 않지만 시스템로드가 낮습니다. 참고 xargs로 단일 sed명령의 명령 줄에 파일 이름을 많이 넣을 수 있습니다. 경로 길이에 따라 사용 가능한 버퍼 크기가 채워집니다.
Volker Siegel

흠 ... 이것이 닫히면 왜 그것을 공언보다 나은지 명확하게 설명하는 것으로 바꿀 수 있습니다.
Volker Siegel

달성 할 수 @VolkerSiegel +대신 \;find오른쪽?
muru September

1
@muru 어쩌면 ... 내 "직업을위한 도구"본능은 분명히 선호하지만 xargs, 당신 말이 맞아요. 에서 man find: -exec command {} +: ... The command line is built in much the same way that xargs.... git filter-branch...;) 의 명령 줄을 생각 나게합니다 .
Volker Siegel

2

아주 간단한 해결책 : 모두 교체 *.txt폴더에있는 파일을 string_1가진 string_2:

sed -i 's/string_1/string_2/g' *.txt

좋은 답변입니다! 추가 만하면됩니다. 현재 디렉토리의 파일에서 문자열을 재귀 적으로 바꾸려면 다음을 시도하십시오.sed -i 's/string_1/string_2/g' $(grep -rEl 'string_1' ./)
drugan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.