grep は、他の文字列が前にない文字列を探します。

grep は、他の文字列が前にない文字列を探します。

コメントアウトされた行を無視するか、1つの文字列だけを一致させ、他の文字列は一致しない方法について多くのガイドを見つけましたが、まだ必要なものが見つかりませんでした。文字列 "indexes"(大文字と小文字を区別しない、apacheconf)を含むが、前に "#"を持たないファイルを再帰的に検索したいと思います。

以下と一致する必要があります。

Options Indexes
Options +Indexes
Options Indexes MultiViews
Options Indexes # Comment
Options Indexes # Indexes

しかし、これではありません:

Options MultiViews # Indexes
# Indexes yadayada Indexes

私のフォームのスクリプトでこれを使用します。

if grep -re "[^#]*ndexes" $DIR1/httpd.conf $DIR2/http; then
    echo Do not use Indexes
fi

上記は私の努力の一つですが、うまくいきません。

答え1

次の入力が与えられた場合:

Options Indexes
Options +Indexes
Options Indexes MultiViews
Options Indexes # Comment
Options Indexes # Indexes
Options MultiViews # Indexes
# Indexes yadayada Indexes

これはうまくいくようです:

$ grep '^[^#]*Indexes' input
Options Indexes
Options +Indexes
Options Indexes MultiViews
Options Indexes # Comment
Options Indexes # Indexes
$ grep -v '^[^#]*Indexes' input
Options MultiViews # Indexes
# Indexes yadayada Indexes

正規表現分析:

  • ^- 行の始まり
  • [^#]*- Octothorpe以外の文字が0個以上含まれています。
  • Indexes- リテラル文字列Indexes

スクリプトのコンテキストに入れます。

if grep -rl -- '^[^#]*Indexes' "$DIR1/httpd.conf" "$DIR2/http"; then
    echo "The above-listed files use an 'Indexes' directive."
fi

関連情報