나는 정의된 이름을 검색한 다음 해당 이름의 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*
이전에는 선행 공백이 무시되었다고 생각했지만 #define
그렇지 않습니다. 내가 뭐 잘못 했어요?
답변1
그냥 사용하세요 awk
( 정규 표현식이 이미 일치할 수 있으므로 사용이 grep
중복되는 것 같습니다 ).awk
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
이를 재귀적으로 실행하려면 다음과 같이 하세요.
mkdir -p a/b/c
echo " #define [name] 0x0001" > a/a.h
echo " #define [name] 0x0002" > a/b/b.h
echo " #define [name] 0x0003" > a/b/c/c.h
tree
.
└── a
├── a.h
└── b
├── b.h
└── c
└── c.h
3 directories, 3 files
awk
작업할 파일 목록을 제공해야 하므로 다음을 수행할 수 있습니다 .
find . -type f -name "*.h" \
-exec awk '$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}' {} \;
0x0002
0x0003
0x0001
답변2
grep -o
줄의 일치하는 부분만 인쇄하는 데 사용됩니다 .
당연히 \s
그 부분은 필요없으니까 다시 빼내세요.