私はbashスクリプトで定義の名前を検索し、それらの16進値を取得して配置しています。名前のリストを取得したら、-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*はしかし、そうではありません。何か問題がありますか?

コメント

  • 拡張正規表現を使用する必要があると思います。 -Eフラグを使用して\s
  • 私はそうですが、この問題は先頭の空白が原因で#defineを$ 1から$ 2にシフトする
  • 問題をより適切に説明する必要があります。何を達成したいのか理解するのは難しいです。

回答

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 

これを再帰的に実行するには、たとえば

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を取得できます。

混乱します。

回答

は、行の一致する部分のみを印刷します。

明らかに、\sの部分は、削除しないでください。その部分が必要です。

コメント

  • 問題は、-oを使用すると、' tが実行されないことです。 #define$p

のみを取得するため、16進値を取得します