文字列に対する Grep コマンドは、コメントアウトされていない行にのみ存在しません。

文字列に対する Grep コマンドは、コメントアウトされていない行にのみ存在しません。
try2:
   set -vn
   set -o pipefail
   set -e
   if grep -v '^#' file.tx | grep -P 'name' file.tx; then \
      echo "    No name"; exit 0;\
      echo " This message is print from file.tx" \
      cat file.tx; fi

1)上記のコードは、次の場合にgrepを試みます。名前には存在しませんファイル.txするとエコーになります「名前なし」。コメントされていない行に単語がない場合は、その単語を探したいが機能しないようです。

2) 最初の声明が偽であればどうすればよいですか? 2番目の声明に進みます。上記のコマンドが機能していないようです。

注:このコードはMakefileに書き込まれ、ターゲット名は次のとおりです。2回試してください

答え1

質問を理解すると、次のファイルがあります。

#魔法の単語名を含むコメント

魔法の言葉が含まれていないもの

「名前なし」を印刷したい。最初の行のコメントを外すと、「名前なし」は印刷されません。

以下はトリックを行う必要があります。

if grep -v '^#' file.tx | grep -q name; then
       echo "no name"
fi

コードでは、2番目のコードにはgrepファイル名が含まれているため、最初のコードのパイプ入力は表示されません。また、Perl正規表現を使用しないため、その項目を削除し、一致が抑制された-P場合-qgrep印刷できる出力も追加しました。

答え2

問題は、nameコメントのないデータをgrepingする代わりにfile.txgrep

grep -v '^#' file.tx | grep -P 'name' file.tx
                                      ^^^^^^^
                                     will not read from pipe

代わりに

grep -v '^#' file.tx | grep -q 'name'

grepつまり、パイプの2番目のファイルを元のファイルから読み取らないでください。また、grep終了ステータス(ドアで使用)にのみ興味があるので、if一緒に使用してください-q


2番目の質問を考えると、正しく理解すると、cat file.tx文字列がnameコメントの外側に表示される場合にのみ実行したいようです。この場合、ロジックは逆さまに進みます。

if grep -v '^#' file.ex | grep -q 'name'; then

nameコメント以外の行に文字列が表示された場合は真です。ファイルが必要な場合はcatここで行う必要があります。

if grep -v '^#' file.ex | grep -q 'name'; then \
    cat file.tx; \
else \
    echo 'No name'; \
fi

exit 0これが他のMakefileターゲットに与える影響はわかりません。ターゲットにしたい場合失敗するname存在しない場合は後でexit 1実行してくださいecho。それ以外の場合はまったく終了しないでください(同じMakefileターゲットでより多くのシェルコードを実行したくない場合)。

私も現在のディレクトリがcd ../..そうでない限り、あなたのものを見つけました。file.txそしてディレクトリでは失敗../..しますcat。なぜ私は2つのディレクトリに上がりたいのか言及していないので、それについてあまり話すことはできません。

また、cdシェルのフラグメントが完了すると、ターゲットmakeの個々の行が別々のシェルインスタンスで実行されるため、「元に戻す」ことになります。これはまた、setあなたが持っているさまざまな指示が実行されていることを意味します。分離シェル。

関連情報