[bash] 일부 패턴을 제외하고 grep하는 방법?

일부 패턴이 있고 다른 패턴이없는 파일에서 줄을 찾고 싶습니다. 예를 들어, 내가 포함한 모든 파일 / 라인을 찾을 필요 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)

목표를 달성하려면 어떻게해야합니까?

편집 1 : 난 그 의미loomgloom문자 시퀀스 (반드시 단어가) 있습니다. 따라서 예를 들어bloomberg명령 출력에 필요하고ungloomy.

편집 2 : 내 기대치의 샘플이 있습니다. 다음 두 줄은 모두 명령 출력에 있습니다.

나는 향의 베일을 통해 어렴풋이 드러나는 아이콘을 마주했다 .

Arty는 우울한 날에 어둡 습니다 .

다음 줄은 모두 명령 출력에 없습니다.

그것은이다 ‘gloomyin cloods – 오 좋은 muckle doolders 심고 끔찍한’.

heigh pyntit 홀의 남서쪽 라운드에서



답변

그립을 연결하는 것은 어떻습니까?

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'


답변

체인이없는 또 다른 솔루션 grep:

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

괄호 사이에, 당신은 문자 제외 g의 발생 이전을 loom하지 않는 한 loom라인의 첫 번째 문자입니다.


답변

조금 늙었지만 오 글쎄 …

@houbysoft에서 가장 많이 투표 한 솔루션은 “loom”이 있더라도 “gloom”이 포함 된 라인을 제외하므로 작동하지 않습니다. OP의 기대에 따라 “loom”이 포함 된 라인도 포함해야합니다. 이 라인은 “Arty is slooming in a darky day.”라는 출력에 있어야합니다.

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

대신 Bentoy13egrep 정규식 예제가 더 잘 작동합니다.

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

“gloom”이 있는지 여부에 관계없이 “loom”이있는 모든 라인을 포함합니다. 반면에 어둡기 만한다면 OP가 원하는 행동을 포함하지 않을 것입니다.


답변

awk를 사용하면 복합 조건을 명확하게 표현할 수있는 grep보다 훨씬 간단합니다.

loomgloom다음을 모두 포함하는 줄을 건너 뛰려면

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은 그 자체로 단어 로 나타나는 줄을 원하면 :

awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)


답변

-v “inverted match”플래그이므로 파이핑은 매우 좋은 방법입니다.

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을 사용하여 원하는 작업을 수행합니다. 파일 이름, 줄 번호 및 실제 줄도 있습니다.

업데이트 또는 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지원되는 (perl regex) 사용할 수 있습니다 negative lookbehind.

grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)

\b단어 경계를 추가 했습니다.