awkは一致する単語のみを印刷します。

awkは一致する単語のみを印刷します。

Makefileを生成するスクリプトを作成する必要があります。

依存関係を確認するときは、各.cppファイルの "---.h"ヘッダーを確認してください。私は使用する:

echo $(awk '/^".*h"$/ { print $0 }' $file) >> Makefile

明らかに「myheader.h」部分(「」を除く)を取得する最良の方法は何ですか? awkを使ってこれを達成できますか?好ましくは単純な方が良い。この時点で私はawkをほとんど理解していません。

修正する:

以下は私の問題を解決しました。

awk -F '"' '/\.h"/ {print $2}' $file

答え1

なぜawk?これのために? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefileこれで問題が解決します。

答え2

公開された(現在承認されている)grep回答にはいくつかの問題があり、その中で最も重要なのはどのAwkスクリプトの正規表現に一致するシーケンスだけでなく、シーケンスを含む文字列も印刷します.h(たとえば、構造体のメンバ参照などlinkedlist.head)。私はこれを使用しますsed

sed -n 's/^"\(.*h\)"$/\1/p "$file" >> Makefile

私はOPがそうではないと強く疑います。実際に二重引用符内の文字で終わるすべての文字列を一致させたい場合h、これが実際にこの正規表現が実行する作業です。おそらくより合理的な推測はこれです。

sed -n 's/^ *# *include  *"\([^"]*\.h\)".*$/\1/p < "$file" >> Makefile

前のオプションのスペースは#include経験に基づく推測です。ここでは、フォーカスは[^"]*\.h二重引用符を含まず、リテラル文字で終わる文字列をキャプチャする正規表現にあります.h

答え3

これにより、以下をawk使用できます。

awk -F '"' '
  /^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+".*\.h"/ {
    print $2
  }'

フィールド区切り文字を"次の行に一致するように設定しました。

#include "something.h"

ここから2番目のフィールドを抽出します(つまり、最初のフィールドと2番目のフィールドの間のコンテンツ")。

関連情報