2012-07-24 7 views
2

각 서브 디렉토리 (SUBDIRS에 저장)에있는 파일 (conf.py)의 텍스트 블록이 삭제되도록하려고합니다. 이 텍스트 블록은 #--Begin#--End 태그 내에 있습니다. 아래 코드 샘플을 참조하십시오. 깔끔하고 세련된 쉘 스크립트를 만들 필요가 없기 때문에 makefile에서 sed 명령을 사용하고 싶습니다.하지만 그렇게하는 데 문제가 있습니다. 다른 포럼 게시판에서이 문제에 대한 해결책을 찾을 수 없으므로 도움을 주시면 감사하겠습니다.Makefile에서 sed 사용하기

.PHONY $(SUBDIRS) 
SUBDIRS = (list of all subdirectories that contain a relevant conf.py) 
$(SUBDIRS): 
    sed '/#--Begin/,/#--End/d' Docs/[email protected]/conf.py 

이 명령의 결과로 아무런 변화가 없습니다.

감사합니다.

답변

5

makefile에 통합하기 전에 명령 줄에서 sed 명령을 테스트해야합니다. 작성된대로 제거하려는 선을 제거한 다음 결과를 표준 출력으로 보냅니다. 장소에 파일을 수정하려면 -i을 사용해야합니다

sed -i -e '/#--Begin/,/#--End/d' Docs/[email protected]/conf.py 

다른 문제가있을 수 있습니다. 실제 메이크 파일 (.PHONY $(SUBDIRS)은 합법이 아니므로 작업중인 메이크 파일의 일부분을 붙여 넣지는 않음)을 표시하지 않았지만 규칙이 생각하는대로 실행되지 않을 수도 있습니다. 이 시도 :

$(SUBDIRS): 
    @echo attempting to act on [email protected] 
    @ls Docs/[email protected]/conf.py 

이이 sed 명령을 소개하기 전에 완벽하게을 일 하 러.

+0

감사합니다. 그것은 실망 스럽다. -i 옵션을 추가하는 것만으로도 충분했습니다. – user1488804

5

규칙은 해당 대상에 대해 SUBDIRS 목록을 사용합니다. Make는 이러한 것들이 존재하는지, 어떤 것이 당연히 있는지를 살펴 봅니다. 그들은 다른 것에 의존하지 않으므로 최신 상태이므로 Make는 아무 것도 할 필요가 없습니다.

두 가지 방법이 있습니다.

.PHONY: $(SUBDIRS) 
$(SUBDIRS): 
    sed ..... 

다른 하나는, 예를 들어 파일을 다른 이름의 편집 편집되지 않은 버전을 제공하는 것입니다 : 하나는 때마다 실행하는 명령을 강제로 Phony Target 을 사용하는 것입니다 conf.pyconf.py.in하고, 먼저 Pattern Rule 사용하여 두 번째에 의존합니다

$(SUBDIRS): Docs/%/conf.py: Docs/%/conf.py.in 
    sed '/#--Begin/,/#--End/d' $< >[email protected] 

이 더 낫다, 입력 파일이 변경 될 때마다 자동으로 실행됩니다 때문이다.

+0

처음에는 .PHONY가 포함되지 않은 것에 대해 사과드립니다. 나는 게시하기 전에 이미 이것을 가지고있다. 이 질문을 포함하도록 업데이트되었습니다. – user1488804