あるパターンが発生し、他のパターンが存在しないファイルの行を見つけたいのですが。たとえば、loom
を含むものを除く、gloom
を含むすべてのファイル/行を検索する必要があります。だから、コマンドでloom
を見つけることができます:
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
ここで、loom
を除くgloom
を検索します。ただし、次のコマンドは両方とも失敗しました。
grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)
目標を達成するにはどうすればよいですか?
EDIT 1:loom
とgloom
は文字列(必ずしも単語ではない)であることを意味します。したがって、たとえば、コマンド出力にbloomberg
が必要ですが、ungloomy
は必要ありません。
EDIT 2:私の期待のサンプルがあります。次の行は両方ともコマンド出力にあります。
香のベールを通して迫り来るアイコンに直面しました。
Artyはsloomingのgloomy日です。
次の行は両方ともコマンド出力にありません。
それはグロミインひどいです—偉大なマックルドルダーズoクルード。
Heigh Pyntit Hallの南西ラウンド
Grepsを連結するだけではどうですか?
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
grep
をチェーン化しない別のソリューション:
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
括弧内では、g
が行の最初の文字でない限り、loom
が出現する前に文字loom
を除外します。
少し古いですが、まあ...
@houbysoftの最もよく投票されたソリューションは、「織機」があっても「gloom」が含まれる行を除外するため、機能しません。 OPの予想によると、「織機」のある行も含める必要があります。この行は「Arty is a slooming in a gloomy day。」の出力にある必要がありますが、これは次のような連鎖grepによって除外されます
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
代わりに、 egrep regex の例 Bentoy1
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
「gloom」があるかどうかに関係なく、「loom」が含まれる行が含まれます。一方、暗がりしかない場合、それは含まれません。これは、OPが望んでいる動作です。
Awkを使用するだけで、複合条件を明確に表現できる点でgrepよりもはるかに簡単です。
loom
とgloom
の両方を含む行をスキップする場合:
awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
またはそれらを印刷する場合:
awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
そして、現実がloom
が単独でWordとして表示される行が必要な場合:
awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
-v
は「逆マッチ」フラグなので、パイピングは非常に良い方法です。
grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"
/ *あなたはこのように見えるかもしれませんか?
grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`
BACKQUOTESはコマンドの括弧のように使用されるため、この場合-l
を有効にすると、BACKQUOTESのコードはファイル名を返し、次に-vnを使用して、ファイル名、行番号、および実際の行を指定します。
UPDATEまたはxargsを使用
grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"
お役に立てば幸いです。* /
上に書いたものは無視してください、それはゴミです。
grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom"
#this part gets the filenames with "loom"
#this part gets the lines with "loom"
#this part gets the linenumber,
#filename and actual line
grep -P
をサポートするnegative lookbehind
(Perl正規表現)を使用できます:
grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)
Wordの境界に\b
を追加しました。
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
単に使用してください! grep -v
を複数回。
[root@server]# cat file
1
2
3
4
5
[root@server]# cat file |grep -v 3
1
2
4
5
[root@server]# cat file |grep -v 3 |grep -v 5
1
2
4
質問:「gloom」を除く「loom」を検索してください。
回答:
grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)