리터럴 탭을 사용하지 않고 탭을 grep하는 방법과 왜 작동하지 않습니까? 사용하여 파일에서 탭을 검색

(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