Grep 및 선행 공백 무시

Grep 및 선행 공백 무시

나는 정의된 이름을 검색한 다음 해당 이름의 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그 부분은 필요없으니까 다시 빼내세요.

관련 정보