$cat contents.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
위 출력에는 빈 줄이 있습니다.
$cat contents.txt | grep cat
cat이라는 단어가 강조 표시되지만 결과 텍스트도 병합되어 빈 줄이 제거됩니다.
cat-1.15
cat-1.15
cat-1.15
cat-1.18
유일한 차이점이 강조 표시된 grep 용어가 되도록 텍스트 구조에 영향을 주지 않고 어떻게 강조 표시를 할 수 있습니까?
답변1
GNU grep을 사용하면 옵션을 통해 이 작업을 수행할 수 있습니다 -z
.
-z, --빈 데이터
입력 및 출력 데이터를 일련의 줄로 처리합니다. 각 줄은 개행 문자 대신 0바이트(ASCII NUL 문자)로 끝납니다. -Z 또는 --null 옵션과 마찬가지로 이 옵션은 sort -z와 같은 명령과 함께 사용하여 임의의 파일 이름을 처리할 수 있습니다.
이것은 또한우루무치대학교. grep을 사용하여 입력 파일을 지정할 수 있습니다.
$ grep --color cat contents.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
$ grep --color -z cat contents.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
답변2
또 다른 가능한 해결책은 두 가지 패턴을 제공하는 것입니다 grep
. 하나는 검색할 실제 패턴 또는 용어이고, 두 번째는 빈 문자열입니다.
$ grep --color -e 'cat' -e '' testfile.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
이 -e
옵션은 여러 모드를 지정하는 데 사용됩니다. 매뉴얼에서:
-e PATTERN
,--regexp=PATTERN
패턴으로 PATTERN을 사용합니다. 여러 검색 패턴을 지정하거나 하이픈(-)으로 시작하는 패턴을 보호하는 데 사용할 수 있습니다. (
-e
POSIX에서 지정)
원하는 경우 이러한 패턴을 단일 확장 정규식으로 결합할 수도 있습니다.
$ grep --color -E 'cat|' testfile.txt
cat-1.15
cat-1.15
cat-1.15
cat-1.18
또한 여러 키워드를 강조 표시해야 하는 경우 목록에 다른 모드를 추가하면 됩니다.
답변3
grep에는 더 많은 가능성이 있습니다.
grep은 다음의 인스턴스를 0개 이상 찾습니다 cat
.
grep --color '\(cat\)*' contents.txt
그렙cat
또는빈 문자열:
grep -E --color 'cat|' contents.txt
(-E는 확장 정규식 구문을 지정합니다. egrep
여기서 대신 사용할 수 있습니다 grep -E
.)
아니면 당신은 사용할 수 있습니다sed
수동 채색 사용ANSI 이스케이프 코드:
red='\c[[1;31m'
default='\c[[0m'
sed "s/cat/${red}cat${default}/g" contents.txt
쉘 변수는 편의를 위해서만 여기에 red
있습니다 . 해당 값은 sed 표현식에 인라인으로 배치될 수도 있습니다.default
답변4
다음 명령을 사용해 보았습니다.
sed -r "/cat/{N;s/^$/&=/}" filename
awk '{if(((length($1)>3)&& ($1 ~ /cat/))||($0~/^$/)){print $0}}' filename