일부 패턴이 있고 다른 패턴이없는 파일에서 줄을 찾고 싶습니다. 예를 들어, 내가 포함한 모든 파일 / 라인을 찾을 필요 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 : 난 그 의미loom
와gloom
문자 시퀀스 (반드시 단어가) 있습니다. 따라서 예를 들어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'
대신 Bentoy13 의 egrep 정규식 예제가 더 잘 작동합니다.
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
은 그 자체로 단어 로 나타나는 줄을 원하면 :
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
단어 경계를 추가 했습니다.