하나의 큰 텍스트 파일에서 여러 검색 및 바꾸기 작업


11

큰 텍스트 파일 (약 2GB)이 있습니다. 동일한 파일에서 5 개의 검색 및 바꾸기 작업을 수행하고 싶습니다. 한 명령 으로이 작업을 수행하고 싶습니다. 일반적으로 vim을 사용하고, 파일을 열고, 하나의 바꾸기 작업을 수행 한 후 다음을 수행합니다. 3-4 개의 검색 후에 vim이 메모리 문제로 인해 충돌 한 것으로 나타났습니다.

Vim에서 사용하는 명령의 두 가지 예는 다음과 같습니다.

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g

이것을 처리하는 가장 좋은 방법은 무엇입니까?

답변:


8

나는 sed를 다음과 같이 사용할 것이다 :

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt

-i옵션은 "제자리"교체를 나타냅니다. sed에게이 옵션의 확장자를 제공하는 파일 백업을 만들도록 지시 할 수 있습니다 ( -i.bakyourfile.txt를 yourfile.txt.bak로 백업합니다).


빠르다! 당신의 대답 ;-)뿐만 아니라 검색과 바꾸기가 5 인이 스크립트는 vim에서 파일을 여는 것보다 약 10 배 빠릅니다. 한 가지가 나를 혼란스럽게했습니다. 처음에는 .bak 파일이 편집 된 파일이라고 생각했지만 당연히 원본입니다.
SPRBRN

한 번에 2GB 파일에서 10 번의 검색 및 바꾸기 작업 (수천 개의 적중 횟수), 메모리 문제 없음. 평균적인 데스크탑에서 2 분도 채 걸리지 않습니다.
SPRBRN

한가지 질문은 ... 당신은 교체 문자열에서 점을 피합니다. 이것이 필요합니까?
SPRBRN

1
@rxt를 환영합니다. :) 사실, 맞습니다 sed. 의 대체 문자열에 이스케이프되지 않은 점을 사용할 수 있습니다 . 시도했지만 작동합니다. Unix & Linux Stackexchange 에는 좋은 스레드가 있으며 허용 된 답변은 점을 탈출 할 문자로 언급하지 않습니다.
ssssteffff

2
@rxt 당신은 문자열을 교체 한다고 말했다 . 죄송합니다.
terdon

6

더 많은 검색 패턴이있는 경우 파일에 저장하고 대체 패턴을 읽을 수 있습니다. 예를 들어, 다음 내용이 있다고 가정하십시오 replacements.txt.

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop

그런 다음 N 개의 교체 목록을 읽고 다음과 같이 교체 할 수 있습니다.

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 

노트:

  • 검색 문자열에 공백이없고 이상한 문자를 이스케이프해야한다고 가정합니다 replacements.txt.
  • sed교체 작업이 많은 경우 교체 당 하나씩 실행 되며 시간이 걸릴 수 있습니다.
  • 시간이 조금 더 걸리는 것을 신경 쓰지 않는 한 임의의 수의 교체 (수천 또는 수백만 또는 기타)를 처리 할 수 ​​있습니다.

다른 옵션은 위의 내용을 sed스크립트 로 작성하는 것입니다 .

s/www\.abcdef/www\.test\.abcdef/g;
s/www\.kmlnop/www\.test\.klmnop/g;
s/aaaa/bbbb/g;
s/cccc/dddd/g;
s/eeee/ffff/g;

그런 다음 파일에서 스크립트를 실행할 수 있으며 모든 대체를 한 번에 수행합니다.

sed -f replace.sed infile.txt 

다른 옵션은 +1 ''입니다. 대체물을 파일에 저장하는 것이 편리 할 수 ​​있습니다! (내가 그것을 기억하길 바란다 ...)
mpy

"기타 옵션"도 +1입니다.이 스크립트는 사용자 지정 스크립트가 아닌 기본 기능을 사용하기 때문에 더욱 이식 가능하고 공유 가능합니다.
David Cook

@DavidCook에게 감사하지만 다른 것보다 더 네이티브이거나 이식 가능하지 않습니다. 첫 번째 방법은 POSIX 셸 루프를 사용하는 것이며, 두 번째 방법과 똑같이 이식성이 있습니다. 쉘 루프를 사용하기 때문에 속도가 훨씬 느려집니다.
terdon

sed 스크립트 파일 형식은 스크립트가 아닌 내장 sed 기능을 사용하므로 replacements.txt 파일과 함께 공유해야하기 때문에 sed 스크립트 파일 형식이 더 이식 가능하다는 것입니다. 그럼에도 불구하고 둘 다 훌륭한 옵션입니다!
David Cook
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.