정의 이름을 검색 한 다음 16 진수 값을 가져와 입력하는 bash 스크립트를 작성했습니다. 이름 목록이 있으면 -w를 사용하여 “#define [name]”을 검색하여 정확히 일치하는지 확인한 다음 awk “{print $ 3}”를 사용하여 16 진수 값을 가져옵니다.

하지만 헤더 파일의 행이 다음과 유사하면 작동합니다.

a.h:#define [name] 0x0001 

하지만 유사하면 작동하지 않습니다.

a.h: #define [name] 0x0001 

이 문제를 어떻게 해결할 수 있습니까? 나는 이것을 시도했다

grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }" 

\s*가 하지만 그렇지 않습니다. 내가 뭘 잘못하고 있는가?

댓글

  • 확장 된 grep 또는 -E 플래그를 사용하여 \s
  • 그렇습니다.하지만 문제는 #define를 $ 1에서 $ 2로 변경
  • 문제를 더 잘 설명해야합니다. 달성하려는 목표를 이해하기 어렵습니다.

답변

awk 사용 (grepawk가 이미 정규 표현식과 일치 할 수 있기 때문에 중복 된 것 같습니다.) :

awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h 

계속 진행 자세한 표현식 :

$0 ~ /regexp/ # look for the regular expression in the record \s* # whitespace, any number of times \#define # literal string, "#" has to be scaped \s* # same as above .* # any character, any number of times, this is # your hex code and you can refine the regex here { print $3 } # print the third field if the record matches 

이 작업을 재귀 적으로 실행하려면, 예 :

awk에 작업 할 파일 목록을 제공해야하므로 다음을 수행 할 수 있습니다.

find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001 

코멘트

  • 이것도 재귀를 처리 할 수 있습니까? (하위 디렉토리에서 * .h 확인)
  • 잘하셨습니다. 멋지네요. 몇 가지 제안과 테스트를 통해 grep -Ro '#define\s*\(.*\)' *.h가 작동하는 것으로 나타났습니다. -o 전체 행을 가져 오기가 까다로 웠지만 뒤에 오는 내용을 포함하라고 말하면 이제 awk를 사용하여 요소 3을 가져올 수 있습니다. grep에는 헤더 파일 이름이 포함되므로 #define 엉망이됩니다.

답변

grep -o 행에서 일치하는 부분 만 인쇄합니다.

분명히 \s 부분을 다시 꺼내십시오. 그 부분을 원합니다.

댓글

  • 문제는 -o를 사용하는 것입니다. 이제 저는 ' #define$p

만 가져 오므로 16 진수 값을 가져옵니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다