2012-04-06 3 views
21

다음과 같은 줄이 포함될 수있는 파일이 있습니다.grep을 사용하여 탭 검색

내가 선이 발견되면 값이 발견되지 않는 경우, 단자에 falsetrue을 반환 싶어 탭으로

A B // 구분. 내가 grep 'A' 'file.tsv'을 수행 할 때

는, 그것은 (참/거짓되지 않음) 행을 반환 하지만

grep 'A \t B' "File.tsv" 

또는

grep 'A \\t B' "File.tsv" 

또는

grep 'A\tB' 

또는

grep 'A<TAB>B' // 탭 버튼 누르기

아무 것도 반환하지 않습니다.

어떻게 grep을 사용하여 탭 구분 값을 검색합니까?

grep을 사용하여 부울 값을 반환하는 방법은 무엇입니까?

+2

[grep $ 'A \ tB'', 대답은 [here] (http://stackoverflow.com/questions/9954515/grep-find-lines-that-contains-t) – sleepsort

답변

25

문자 인 \t 이스케이프가 아닌 문자를 사용하십시오. Ctrl + V을 먼저 눌러야 할 수도 있습니다. grep은 Perl 6 (또는 /x 수정자를 사용하는 Perl 5)이 아닙니다. 공백은 중요하며 글자 그대로 일치하므로 \t\t 주위에 여분의 공백이있는 A \t B이 실제로 공백이 원본에 없으면 작동하지 않더라도 마찬가지입니다.

반환 값은 표준 출력, 표준 오류 및 종료 코드 등 세 가지 종류의 응답을 프로그램에서 얻게됩니다. 후자는 성공에 대해서는 0이고 일부 오류에 대해서는 0이 아닙니다 (일치하는 대부분의 프로그램에 대해 1은 찾을 수없고 2 이상은 일종의 사용 오류를 의미 함). 전통적인 Unix에서는 종료 코드 만 원하면 grep의 출력을 리디렉션합니다. GNU grep을 사용하면 대신 -q 옵션을 사용할 수 있지만 이식성이 없다는 점에 유의하십시오. 전통적인 것과 GNU grep-s이 표준 오류를 억제하도록 허용하지만, 두 가지가 그것을 어떻게 처리하는지에 약간의 차이가 있습니다; 대부분의 휴대용은 grep PATTERN FILE >/dev/null 2>&1입니다.

+1

참고 사항 '\ t'와 같이 이스케이프 된 *은 * -P * 옵션을 사용하여 최근의 GNU'grep'에서 PCRE 정규식을 활성화 할 수 있습니다. – geekosaur

+0

리터럴 TAB 문자조차 작동하지 않습니다. 탭 문자를 누르면 무언가 같은 빼기 기호가 나타납니다. 그러나 검색하지 않습니다. – Ank

+2

"뭔가 빼기 기호"가 잘못 들었습니다. 'bash'에서 터미널 설정에 따라'Tab '자체가 비프 음/깜박 거립니다. 'Ctrl' +'V' 다음에'Tab'이 탭 문자를 삽입합니다. 이것을 터미널이나 에디터 (그리고 후자라면?)에 직접 입력하고 있습니까? – geekosaur

14

두 가지 방법 : 는 -P 옵션을 사용

grep -P 'A\tB' "File.tsv" 

가 + V 첫번째 Ctrl 키를 입력하고 탭 입력을

grep 'A B' "File.tsv" 
+0

필자는 -P 스위치가 마음에 들었고 "적절한"Perl 스타일의 RegExp를 켜고 탭 문자를 검색했습니다. 일부 시스템에서는 이것이 더 느리게 실행될 수도 있고 전혀 실행되지 않을 수도 있습니다. '의심되는'탭이 있지만 확실하지 않은 경우 'grep -P "A \ s + B"'는 A와 B 사이의 모든 탭과 공백을 중얼 거려야하며 아마도 원하는 것일 것입니다. –

7

다음과 같은 문자 탭 변수를 만들 수있는 편리한 방법입니다 그 값 : 그런 다음 다음과 같이

TAB=`echo -e "\t"` 

, 당신은 그것을 사용할 수 있습니다

grep "A${TAB}B" File.tsv 

이렇게하면 리터럴 탭이 필요하지 않습니다. 이 방법을 사용하면 패턴 문자열 주위에 작은 따옴표가 아닌 큰 따옴표를 사용해야합니다. 그렇지 않으면 변수 참조가 대체되지 않습니다.

+1

이 파일은'grep -P '\ t'*'를 사용할 수 없어서 osx에서 특히 유용합니다. –

관련 문제