여러 파일에서 특정 문자열을 찾아서 바꿔야할때가 있다. 이걸 일일히 한다는 것은 매우 비생산적인 일이다. 윈도우즈같으면 검색을 사용하거나 이런 기능을 제공하는 에디터 프로그램 등을 찾아봐야하겠지만, 리눅스(유닉스)에서는 자잘한 유틸리티들의 조합이나 스크립트 등을 통해서 쉽게 해결할 수 있다.

  • txt 확장자를 가진 파일들에서 문자열 검색하기
    find . -name "*.txt" -print0 | xargs -r -0 grep -l [문자열]
  • 문자열을 치환하는 스크립트
    #!/bin/bash
    #특정 디렉토리에 있는 모든 파일에서 일치하는 문자열을 모두 찾아 바꾸기.
    
    if [ $# -ne 2 ]
    then
    echo "사용법 'basename $0' find_string replace_string [directory]"
    exit 65
    fi
    
    if [ -n "$3" ]
    then
    directory=$3 # 디렉토리 이름이 인자로 주어질 경우...
    else
    directory=$PWD # 아니면 현재 디렉토리에 대해서.
    fi
    
    #for file in $directory/*
    for file in $(find . -type f -name '*' | sort )
    do
    if [ $0 != $file ];then
    IsMessage=$(grep "$1" -c $file)
    # echo $file
    # if [ $IsMessage = 0 ]; then
    # echo $file No Message
    # else
    # echo $file Message
    if [ $IsMessage != 0 ]; then
    cp $file $file.ori
    sed -e "s%$1%$2%" $file > $file.tmp
    echo $file에서 찾아 바꾸기를 하였습니다.
    mv "$file.tmp" $file
    fi
    fi
    done
    
    exit 0
  • find와 perl을 이용한 문자열 치환
    find . -type f -exec perl -pi -e 's|test|TESTING|g' {} ;
  • VIM을 이용한 치환
    1. vim 실행
      vim `find . -type f`
    2. 실행후
      :set hidden
      
      :argdo %s/바꾸기전문자열/바꾼후문자열/gc
    3. 저장
      :wall
  • find와 sed를 이용한 스크립트
    #!/bin/bash
    for i in `find . -name "*" -print`
    do
    sed -e s/test/TESTING/g $i > $i.old
    mv $i.old $i
    done

+ Recent posts