(e) grep을 사용하여 파일에서 탭을 검색 할 때는 리터럴 탭 ( ^v + <tab>
)을 사용합니다 . \t
정규식에서 탭을 대신 할 수는 없습니다 . 예를 들어 sed를 사용하면이 표현이 잘 작동합니다.
따라서 비 리터럴 대체품을 사용할 가능성이 있습니까? 그리고 <tab>
작동하지 않거나 해석되지 않은 배경은 무엇 \t
입니까?
답변
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 기사를 참조하십시오 .
답변
정확하게 듣고 싶은 답은 아니지만 bash는 이스케이프 시퀀스를 사용할 수 있습니다.
command | 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