답변:
grep은 POSIX 에서 정의한 정규식을 사용하고 있습니다. 어떤 이유로 POSIX가 \t
탭으로 정의되지 않았습니다 .
몇 가지 대안이 있습니다.
grep에게 perl에 의해 정의 된 정규식을 사용하도록 지시하십시오 (perl에는 \t
탭이 있음).
grep -P "\t" foo.txt
매뉴얼 페이지는 이것이 "실험적인"기능이라고 경고합니다. 적어도 \t
잘 작동하는 것 같습니다. 그러나 고급 펄 정규식 기능은 그렇지 않을 수 있습니다.
printf를 사용하여 탭 문자를 인쇄하십시오.
grep "$(printf '\t')" foo.txt
리터럴 탭 문자를 사용하십시오.
grep "^V<tab>" foo.txt
즉 : 유형 grep "
, 다음 Enter 키를 눌러 ctrl+v
다음 Enter 키를 눌러, tab
다음 입력 " foo.txt
. ctrl+v
터미널에서를 누르면 다음 키가 그대로 사용됩니다. 이는 터미널이 탭 키에 바인딩 된 일부 기능을 트리거하는 대신 탭 문자를 삽입 함을 의미합니다.
bash 의 주석 인용 기능을 사용하십시오 .
grep $'\t' foo.txt
모든 쉘에서 작동하지는 않습니다.
awk를 사용하십시오 :
awk '/\t/'
sed를 사용하십시오 :
sed -n '/\t/p'
POSIX 및 기타 시스템에서 정의 된 문자 클래스에 대한 개요는 정규식에 대한 Wikipedia 기사를 참조하십시오 .
grep $'\t' foo.txt
(하지만 일반적으로 쓰는 것 fgrep
대신를 grep
)
grep "$(printf '\t')${myvar}" foo.txt
. 잘 작동했습니다. 몇 번의 시도만으로도 마지막 양식을 사용할 수 없었습니다.
grep
이 \t
탭으로 자동 해석하지 못하는 이유가 있습니까? POSIX가 \t
다른 의미를 요구합니까 ? 아마도 리터럴과 일치 \
하고 t
?
This is highly experimental and grep -P may warn of unimplemented features.
아마도 -P
레거시 시스템에서 사용하는 것은 좋지 않습니다 . printf
선택은 더
정확하게 듣고 싶은 답은 아니지만 bash는 이스케이프 시퀀스를 사용할 수 있습니다.
command | grep $'\t'
(큰 따옴표로 묶지 마십시오!).
grep $'\t'
.
awk '/\t/'
내가 가장 좋아하는 해결 방법은 다음과 같습니다.
printf 'a\t\nb' | awk '/\t/'
출력 : a\t
.
탭에는 항상 ASCII 16 진수 코드를 사용하는 것이 좋습니다.
$ echo "one"$'\t'"two" > input.txt
$ grep -P "\x9" input.txt
one two
$ grep $'\x9' input.txt
one two