まず、次のコードを試してください。
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 ^...
ファイル行の先頭と一致しません。