私は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
コメント
混乱します。
grep -Ro '#define\s*\(.*\)' *.h
が機能することがわかりました。 -oは行全体を取得するのが難しいですが、後に続くものを含めるように指示した場合は、awkを使用して要素3を取得できます。