grep
유닉스 플랫폼의 파일에서 탭 (\ t)을 어떻게합니까 ?
grep
유닉스 플랫폼의 파일에서 탭 (\ t)을 어떻게합니까 ?
답변:
GNU grep을 사용하는 경우 Perl 스타일 regexp를 사용할 수 있습니다.
grep -P '\t' *
-P
옵션에 대해 아무것도 모른다 .
트릭은 작은 따옴표 앞에 $ 기호를 사용하는 것 입니다. 절단 및 기타 도구 에도 적용됩니다 .
grep $'\t' sample.txt
zsh
내가 알 수 있는 한 잘 작동 합니다. 그 $
부호 의 의미가 무엇인지 언급 할 수 있습니까?
$'\t'' '
. sh와 함께 작동하는 실제 예제는 bash (Android에 기본적으로 설치되지 않은 bash뿐만 아니라)입니다 busybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems
.
'\ t'메타 문자를 grep과 함께 사용할 수 없었습니다. 그러나 두 가지 대체 솔루션을 찾았습니다.
<Ctrl-V> <TAB>
(Ctrl-V를 누르고 탭 입력)foo | awk '/\t/'
| awk '/\t/'
솔루션은 모든 쉘, 플랫폼 및 시스템에서 작동합니다.
awk
여기에서 잘 작동하지만 파일이 매우 큰 내 컴퓨터의 일부 테스트에서는을 사용하는 것보다 약 30 % 느립니다 grep -P
. 이것은 사용 사례에 따라 사소하고 관련성 awk
이 없으며 가독성과 이식성에 더 좋을 수 있습니다.
에서 이 답변 우분투 질문에 :
grep에게 Perl에 의해 정의 된 정규식을 사용하도록 지시하십시오 (Perl에는
\t
탭이 있음).grep -P "\t" <file name>
리터럴 탭 문자를 사용하십시오.
grep "^V<tab>" <filename>
printf
탭 문자를 인쇄하는 데 사용하십시오 .grep "$(printf '\t')" <filename>
한 가지 방법은 (Bash와 함께)
grep -P '\t'
-P
Perl 정규 표현식을 켜면 \ t가 작동합니다.
사용자 풀기 에서 알 수 있듯이 GNU grep에만 해당 될 수 있습니다. 대안은 쉘, 편집기 또는 터미널에서 허용하는 경우 문자 그대로 탭을 삽입하는 것입니다.
표현식 안에 탭을 문자 그대로 삽입하는 또 다른 방법은 $'\t'
Bash에서 덜 알려진 인용문을 사용하는 것입니다 .
grep $'foo\tbar' # matches eg. 'foo<tab>bar'
(고정 문자열과 일치하는 경우 '-F'모드와 함께 사용할 수 있습니다.)
때로는 변수를 사용하면 표기법을 좀 더 읽기 쉽고 관리하기 쉽게 만들 수 있습니다.
tab=$'\t' # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id" # matches eg. `bob2<tab>323`
기본적으로이를 해결하는 두 가지 방법이 있습니다.
( 권장 ) grep (1)에서 지원하는 정규식 구문을 사용하십시오. 최신 grep (1)은 POSIX 1003.2 정규식 구문의 두 가지 형식 인 기본 (사용되지 않는) RE와 최신 RE를 지원합니다. 구문은 각각 BSD 및 Linux 시스템의 일부인 re_format (7) 및 regex (7) 매뉴얼 페이지에 자세히 설명되어 있습니다. GNU grep (1)은 pcre (3) 라이브러리에서 제공하는 Perl 호환 RE도 지원합니다.
정규식 언어에서 탭 기호는 일반적으로 \t
원자로 인코딩됩니다 . 원자는 BSD 확장 정규 표현식 ( egrep
, grep -E
BSD 호환 시스템에서)과 Perl 호환 RE ( pcregrep
, GNU에서 지원됩니다.grep -P
)에서 지원됩니다.
기본 정규 표현식과 Linux 확장 RE는 모두 \t
. 지원하는 정규식 언어를 알려면 UNIX 유틸리티 매뉴얼 페이지를 참조하십시오 (따라서 sed (1), awk (1) 및 pcregrep (1) 정규 표현식의 차이점).
따라서 Linux에서 :
$ grep -P '\t' FILE ...
BSD 유사 시스템에서 :
$ egrep '\t' FILE ...
$ grep -E '\t' FILE ...
탭 문자를 패턴으로 전달하십시오. 스크립트 파일을 편집 할 때 간단합니다.
# no tabs for Python please!
grep -q ' ' *.py && exit 1
그러나 대화식 쉘에서 작업 할 때 쉘에 올바른 기호를 입력하려면 쉘 및 터미널 기능에 의존해야합니다. 대부분의 터미널에서 Ctrl
+ V
키 조합을 통해 터미널에서 다음 입력 문자를 문자 그대로 처리하도록 지시 할 수 있습니다 ( V
"verbatim"의 경우).
$ grep '<Ctrl>+<V><TAB>' FILE ...
일부 쉘은 명령 유형 설정에 대한 고급 지원을 제공 할 수 있습니다. bash (1)에서 형식의 단어는 다음과 같이 $'string'
특별하게 취급됩니다.
bash$ grep $'\t' FILE ...
그러나 명령 줄이 훌륭하지만 스크립트를 다른 플랫폼으로 옮길 때 호환성 문제가 발생할 수 있습니다. 또한 스페셜을 사용할 때 따옴표에주의하십시오. 자세한 내용은 bash (1)을 참조하십시오.
Bourne 쉘 (및뿐만 아니라)의 경우, 올바른 정규 표현식을 구성하기 위해 printf (1)로 기능 보강 된 명령 대체를 사용하여 동일한 동작을 에뮬레이션 할 수 있습니다.
$ grep "`printf '\t'`" FILE ...
좋은 선택은 'sed as grep'을 사용하는 것입니다 (이 고전적인 sed tutorial에 설명되어 있음 ).
sed -n 's/pattern/&/p' file
예 (bash, sh, ksh, csh, ..에서 작동) :
[~]$ cat testfile
12 3
1 4 abc
xa c
a c\2
1 23
[~]$ sed -n 's/\t/&/p' testfile
xa c
a c\2
[~]$ sed -n 's/\ta\t/&/p' testfile
a c\2
+1 방법, ksh, 대시 등에서 작동합니다. printf를 사용하여 Tab을 삽입하십시오.
grep "$(printf 'BEGIN\tEND')" testfile.txt
grep "$(printf '\t')" testfile.txt
'sed-as-grep'방법을 사용하지만 탭을 개인 취향의 보이는 문자로 바꾸는 것이 내가 가장 좋아하는 방법입니다.
sed -n 's/\t/\*\*\*\*/g' file_name
줄 / 파일 정보 또는 기타 grep 옵션을 사용하고 탭 문자의 눈에 띄는 대체물을보고 싶은 경우 다음과 같이하면됩니다.
grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'
예로서:
$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar
편집 : 분명히 위의 내용은 탭을 찾기 위해 파일 내용을 볼 때만 유용합니다 --- 큰 스크립팅 세션의 일부로 탭을 처리하는 것이 유용한 경우 유용하지 않습니다.
사용하고 싶을 수도 있습니다 grep "$(echo -e '\t')"
유일한 요구 사항은 echo
백 슬래시 이스케이프를 해석 할 수 있어야한다.
이러한 대체 이진 식별 방법은 완전히 작동합니다. 그리고 단일 바이너리 문자의 구문 사용을 기억할 수 없으므로 awk를 사용하는 것이 정말 좋습니다. 그러나 쉘 변수에 POSIX 포터블 방식 (즉, TAB = echo "@" | tr "\100" "\011"
)을 지정하고 POSIX 포터블 방식으로 어디에서나 사용할 수 있어야합니다. 또한 grep "$ TAB"파일 이름). 이 솔루션은 TAB과 잘 작동하지만 TAB 문자 값이 'tr'이 아닌 할당에 다른 원하는 이진 값이 사용될 때 다른 이진 문자도 잘 작동합니다.
다른 답변에 주어진 $ '\ t'표기법은 쉘마다 다릅니다 .bash와 zsh에서 작동하는 것처럼 보이지만 보편적이지 않습니다.
참고 : 다음은 fish
셸용이며 bash에서는 작동하지 않습니다 .
에서 fish
쉘, 하나는 인용 부호로 둘러싸을 사용할 수 있습니다 \t
예를 들어 :
grep \t foo.txt
또는 16 진수 또는 유니 코드 표기법을 사용할 수 있습니다. 예 :
grep \X09 foo.txt
grep \U0009 foo.txt
(이 표기법은 난해한 캐릭터에게 유용합니다)
이러한 값은 따옴표로 묶지 않아야하기 때문에 따옴표와 따옴표없는 값을 연결하여 결합 할 수 있습니다.
grep "foo"\t"bar"
빈 공간을 여러 번 찾으십시오. [[: space :]] *
grep [[: space :]] * '.' '.'
다음과 같은 것을 찾을 것입니다 :
'탭'..
작은 따옴표 ( ')이며 큰 따옴표 ( ")가 아닙니다.
이것은 grep에서 연결하는 방법입니다. =-)
grep "<Ctrl+V><TAB>"
, 그것은 작동합니다 (처음 입력 :grep "
Ctrl + V 키 콤보를 누른 다음 Tab 키를 누른 다음 Enter 키를 누르십시오"
!)