Grep e ignorando espaços em branco iniciais

2

Eu tenho trabalhado em um script bash para procurar por nomes de define e, em seguida, pego os valores hexadecimais para eles e os coloco na lista. Quando eu tiver a lista de nomes, tentarei pesquisar "#define [name]" usando -w para garantir a correspondência exata e, em seguida, awk '{print $ 3}' para obter o valor hexadecimal.

No entanto, funciona se a linha no arquivo de cabeçalho for semelhante a

a.h:#define [name] 0x0001

Mas não funciona se for semelhante a

a.h:    #define [name] 0x0001

Como posso contornar isso? Eu tentei isso

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

Eu achei que o \s* ignoraria o espaço em branco antes de #define , mas não. Estou fazendo algo errado?

    
por Gammerx 29.07.2015 / 21:37

2 respostas

1

Use apenas awk (usando grep parece redundante para mim, pois awk já pode corresponder a uma expressão regular):

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

Percorrendo a expressão com mais detalhes:

$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

Para que isso seja executado recursivamente, por exemplo,

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

como awk precisa receber uma lista de arquivos para operar, você pode:

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

Use grep -o para imprimir apenas a parte correspondente da linha.

Obviamente, retire a parte \s , porque você não quer essa parte.

    
por 29.07.2015 / 22:05