2013-05-21 4 views
0

파일 수가 많고이 파일의 일부 줄을 바꾸기를 원합니다. 필자는 라인의 정확한 내용을 알지 못합니다. 모두 알고있는 두 단어가 모두 포함되어 있습니다. 예를 들어 '프로그래머'와 '밥'을 예로 들어 봅시다. -의 시작 부분에서, 예를 들어여러 파일의 한 줄을 한 줄 번호 범위로 바꾸기

Created by Programmer Bob 
Programmer extraordinaire Bob, such an awesome guy 
Copyright programmer bob, all rights reserved 

지금까지 쉽게 들리지만, 문제는 난 단지 라인 범위 내에 포함 된 라인을 교체하려는된다 : 그래서 교체 할 선 같은 것이 될 수있다 파일 (일반적으로 파일과 관련된 주석을 찾을 수 있음). 나는 실제 코드를 실수로 대체하고 싶지 않기 때문에 파일의 뒷 부분에있는 행을 대체 할 수 없습니다.

그러나 그것은 내가 할 수있는 것 같다 -

find . -exec grep -il -E 'Programmer.*Bob' {} \; | xargs sed -i '1,10 /Programmer.*Bob/Ic\LINE REPLACED' 

가 (아니 점 여기에 내가 생각 GREP은 무한 재귀에 달려 있기 때문에 내가 발견을 사용하고 있습니다..) :

은 지금까지 나는 시도 주소 범위를 c \ (행 변경)로 사용하지 마십시오. 모든 구문 오류를 지적 해 주실 수는 있지만, 모든 것을 시도해 보지 않은 것 같습니다. 이것은 라인 번호없이 작동합니다.

편집 : 나는 대답을 얻었지만 내 대답을 확장하는 내 솔루션을 포함하도록 내 질문을 편집하기로 결정했습니다. 어쩌면 누군가 도움이 될 것입니다.

줄의 시작 부분에 가능한 공백 및 주석 문자를 유지하려고한다는 것을 나중에 깨달았습니다. I는이 명령을 사용하여 이루어진다 :

find . -exec grep -ilI '.*Programmer.*Bob.*' {} \; xargs sed -i -r '1,10 s/([ \t#*]*)(.*Programmer.*Bob.*)/\1LINE REPLACED/I' 

\ 1 패턴과 일치하는 [\의 번호 t *] *를 유지한다. 하나는이 현재 버전 변경 것 (I) 생각 [* \의 t 번호 * 그 라인의 시작에 패턴을 고정 할 ^로 변경되지만 수

** Text I don't want to remove ** Programmer Bob 

** Text I don't want to remove ** LINE REPLACED 

실제로 더 좋을 수 있습니다. (또한 검색 명령에 -I (capital i) 플래그를 추가하여 이진 파일을 건너 뜁니다.)

답변

0

주소와 명령이 혼합되어 있습니다. 간단한 대체 작동합니다 :

find . -exec grep -il -E 'Programmer.*Bob' {} \; \ 
    | xargs sed -i '1,10 s/.*Programmer.*Bob.*/LINE REPLACED/' 
+0

내가 끔찍한 터널 비전을 가진 한 어해야하지만, 어떤 이유로 난 그냥 모를 수가 그것 알아낼. 어쩌면 잠깐 쉬어야 할 것 같아. :) 나는 그것을 시도하고 그것이 작동하는 경우 올바른 것으로 표시합니다. 감사! –

0
find . -type f -name "*.cpp"|xargs perl -pi -e 'if(/Programmer/ && /Bob/ && $.>=1 && $.<10){$_="line to replace"}' 
0

나오지 명령이 대답은 완벽하게 이해하는 것 때문에

>sed '1,10 {s/programmer\|bob/LINE REPLACED/i;s/programmer\|bob//ig}' file 
관련 문제