다음과 같은 내용이 있다고 가정해 보겠습니다 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
모든 것과 일치하며 숫자/해시 문자로 시작하는 줄을 피하지 않습니다 #
.
옵션이 포함된 두 번째 grep을 사용한 파이핑은 -v, --invert-match
일반적으로 색상을 엉망으로 만들고 -H
파일 이름을 보존하기 위해 음수 일치(예: 줄 시작 부분의 숫자/해시 문자)를 지정할 수 없으므로 ^#
다음과 같은 것을 사용해야 합니다. 짐승 grep -H app test.txt --color=always | grep -v '\[K:.\[m.\[K#'
유지 색상:
...하지만 비슷한 작업을 수행한 후에야 올바른 문자 조합을 볼 수 있었는데 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
해석됩니다 . 따라서 반전된 일치가 발생 하고 예상한 결과에서 잘못된 결과가 나옵니다. 그렇지 않은 경우 이 예에서 예상되는 출력은 단 한 줄입니다.'^#'
-v
app
test.txt:non commented line, matchin /app
...올바른 색상 파일 이름으로 일치했습니다.
^#
그렇다면 위에 제시된 지저분한 파이프 없이 단순히 피해야 할 패턴으로 사용하여 이를 달성할 수 있는 방법이 있습니까 ?
답변1
grep -E '^([^#].*)?app' ./infiles* /dev/null
어쨌든 주석이 이미 거의 다 다루어졌을 것 같지만, 줄 시작 [^#]
비주석 일치를 ?
선택 사항으로 설정하면 일치 항목으로 시작하는 줄을 얻게 됩니다.앱또는 다른 것으로 시작한 다음 일치하는 줄을 얻습니다.앱- 하지만 어느 쪽이든 으로 시작하는 줄은 얻지 못할 것입니다 #
.
색상에 관해서는 - 흠... grep
정규식에 따라 다르지만 표준 GNU grep은 전체 일치 항목을 마지막 항목까지 강조 표시해야 합니다.앱성냥. 좀 더 구체적으로 설명하고 싶다면 info grep
GNU가 적절하게 강조 표시하고 구성할 때 어떤 환경 변수를 grep
고려하는지 살펴볼 수 있습니다. 또는 이와 관련하여 만족스러운 결과를 얻지 못한 경우 직접 강조 표시할 수 있습니다.