awk는 일치하는 단어만 인쇄합니다.

awk는 일치하는 단어만 인쇄합니다.

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"

여기에서 두 번째 필드를 추출합니다(즉, 첫 번째 필드와 두 번째 필드 사이의 콘텐츠 ").

관련 정보