두 가지 조건, 하나는 부정, 파이프는 없나요?

두 가지 조건, 하나는 부정, 파이프는 없나요?

다음과 같은 내용이 있다고 가정해 보겠습니다 test.txt.

# commented line, no match
# commented line, would match /app/
# again commented, would match app
non commented line, matchin /app
non commented line, no match

app' '라는 단어가 포함된 모든 줄을 얻고 싶지만 , -아니요댓글이 있으신 분 - 파일명을 출력하고 싶습니다.

분명히 이 사소한 것은 grep -H 'app' test.txt모든 것과 일치하며 숫자/해시 문자로 시작하는 줄을 피하지 않습니다 #.

용어1.png

옵션이 포함된 두 번째 grep을 사용한 파이핑은 -v, --invert-match일반적으로 색상을 엉망으로 만들고 -H파일 이름을 보존하기 위해 음수 일치(예: 줄 시작 부분의 숫자/해시 문자)를 지정할 수 없으므로 ^#다음과 같은 것을 사용해야 합니다. 짐승 grep -H app test.txt --color=always | grep -v '\[K:.\[m.\[K#'유지 색상:

용어2.png

...하지만 비슷한 작업을 수행한 후에야 올바른 문자 조합을 볼 수 있었는데 grep -H app test.txt --color=always | hexdump -C, 이는 가볍게 말하면 지루한 일이었습니다.

-v안타깝게도 이 옵션을 사용 하여 여러 검색 패턴을 지정할 수 있는 옵션과 함께 고유한 (부정적) 패턴을 지정 하는 것은 불가능한 것 같습니다 .-e PATTERN, --regexp=PATTERN

:tmp$ grep -H -e 'app' -v '^#' test.txt
grep: ^#: No such file or directory
test.txt:# commented line, no match
test.txt:non commented line, no match
test.txt:

여기서는 검색 패턴이 아닌 파일 이름으로 grep해석됩니다 . 따라서 반전된 일치가 발생 하고 예상한 결과에서 잘못된 결과가 나옵니다. 그렇지 않은 경우 이 예에서 예상되는 출력은 단 한 줄입니다.'^#'-vapp

test.txt:non commented line, matchin /app

...올바른 색상 파일 이름으로 일치했습니다.

^#그렇다면 위에 제시된 지저분한 파이프 없이 단순히 피해야 할 패턴으로 사용하여 이를 달성할 수 있는 방법이 있습니까 ?

답변1

grep -E '^([^#].*)?app' ./infiles* /dev/null

어쨌든 주석이 이미 거의 다 다루어졌을 것 같지만, 줄 시작 [^#]비주석 일치를 ?선택 사항으로 설정하면 일치 항목으로 시작하는 줄을 얻게 됩니다.또는 다른 것으로 시작한 다음 일치하는 줄을 얻습니다.- 하지만 어느 쪽이든 으로 시작하는 줄은 얻지 못할 것입니다 #.

색상에 관해서는 - 흠... grep정규식에 따라 다르지만 표준 GNU grep은 전체 일치 항목을 마지막 항목까지 강조 표시해야 합니다.성냥. 좀 더 구체적으로 설명하고 싶다면 info grepGNU가 적절하게 강조 표시하고 구성할 때 어떤 환경 변수를 grep고려하는지 살펴볼 수 있습니다. 또는 이와 관련하여 만족스러운 결과를 얻지 못한 경우 직접 강조 표시할 수 있습니다.

관련 정보