Makefile을 생성하는 스크립트를 만들어야 합니다.
종속성을 확인할 때 각 .cpp 파일의 "---.h" 헤더를 확인합니다. 나는 사용한다:
echo $(awk '/^".*h"$/ { print $0 }' $file) >> Makefile
분명히 "myheader.h" 부분("" 제외)을 얻는 가장 좋은 방법은 무엇입니까? awk를 사용하여 이를 달성할 수 있나요? 바람직하게는 단순한 것이 더 좋습니다. 이 시점에서 나는 awk를 거의 이해하지 못합니다.
고쳐 쓰다:
다음은 내 문제를 해결했습니다.
awk -F '"' '/\.h"/ {print $2}' $file
답변1
왜 awk
? 이것을 위해? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefile
그러면 문제가 해결될 것입니다.
답변2
게시된(현재 승인된) grep
답변에는 여러 가지 문제가 있으며 그 중 가장 중요한 것은어느Awk 스크립트의 정규 표현식과 일치하는 시퀀스뿐만 아니라 시퀀스를 포함하는 문자열을 인쇄합니다 .h
(예: 와 같은 구조 멤버 참조에서 linkedlist.head
). 나는 이것을 사용할 것입니다 sed
:
sed -n 's/^"\(.*h\)"$/\1/p "$file" >> Makefile
나는 OP가 그렇지 않다고 강력히 의심합니다.실제로큰따옴표 안의 문자로 끝나는 모든 문자열을 일치시키려는 경우 h
, 이것이 실제로 이 정규 표현식이 수행하는 작업입니다. 아마도 더 합리적인 추측은 이것이다.
sed -n 's/^ *# *include *"\([^"]*\.h\)".*$/\1/p < "$file" >> Makefile
앞에 있는 선택적 공백은 #include
경험에 근거한 추측입니다. 여기서 초점은 [^"]*\.h
큰따옴표를 포함하지 않고 리터럴 문자로 끝나는 문자열을 캡처하는 정규식에 있습니다 .h
.
답변3
이를 통해 다음을 awk
사용할 수 있습니다.
awk -F '"' '
/^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+".*\.h"/ {
print $2
}'
필드 구분자를 "
다음과 같은 줄과 일치하도록 설정했습니다.
#include "something.h"
여기에서 두 번째 필드를 추출합니다(즉, 첫 번째 필드와 두 번째 필드 사이의 콘텐츠 "
).