ファイル内の特定の文字列が含まれ、他の文字列が含まれていない行を見つけるには、findとgrepを使用します。

ファイル内の特定の文字列が含まれ、他の文字列が含まれていない行を見つけるには、findとgrepを使用します。

まず、次のコードを試してください。

find . -name "*.cfg" | xargs grep "good"|grep -v "^\#"

現在のフォルダから拡張子が「cfg」のファイル名のリストを取得します。次に、「good」が含まれているが「#」で始まらない行の内容を検索したいと思います。しかし、私のコードはうまくいきません。何が問題なの?ありがとうございます。

答え1

使用する無駄なxargs(検索結果に-execがある場合):

find . -name "*.cfg" -exec egrep "^[^#]*good" {} +

キャレットはマスクする必要はありません。どのような状況でマスクされるべきかわかりません。しかし、そこには何の害もありません。あなたのすべての命令が私にとって効果的です。

答え2

次のように動作する必要があります。

find . -name "*.cfg" -print0 | xargs -0 grep -E '^([^#].*|)good'

スペースを含むファイル名の問題を回避するために切り替えました-print0

次に、単一の正規表現を含むgoodが起動しない行をフィルタリングします。#左置換([^#].*)は文字ではなく始まる行と一致し#、右置換(空)はで始まる行と一致することを許可しますgood

あなたの質問に2つではなく単一の正規表現を使用すると、GNU grepにファイル名を印刷させることができます(複数のファイルが提供されている場合はこれを行いますfind)。 2番目のステップを追加すると、grep -v ^...ファイル行の先頭と一致しません。

関連情報