여러 파일에서 특정 문자열을 찾아서 바꿔야할때가 있다. 이걸 일일히 한다는 것은 매우 비생산적인 일이다. 윈도우즈같으면 검색을 사용하거나 이런 기능을 제공하는 에디터 프로그램 등을 찾아봐야하겠지만, 리눅스(유닉스)에서는 자잘한 유틸리티들의 조합이나 스크립트 등을 통해서 쉽게 해결할 수 있다.
- 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을 이용한 치환
- vim 실행
vim `find . -type f`
- 실행후
:set hidden :argdo %s/바꾸기전문자열/바꾼후문자열/gc
- 저장
:wall
- vim 실행
- 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
'Operating' 카테고리의 다른 글
리눅스용 네이트온 클로즈 베타 (0) | 2007.07.22 |
---|---|
부요 기반 리눅스에서 DVD 타이틀 보기 (0) | 2007.07.05 |
우분투에서 DVD 보기 (0) | 2007.07.04 |