Programing

유닉스에서 탭을 잡다

lottogame 2020. 2. 23. 11:34
반응형

유닉스에서 탭을 잡다


grep유닉스 플랫폼의 파일에서 탭 (\ t)을 어떻게합니까 ?


GNU grep을 사용하는 경우 Perl 스타일 regexp를 사용할 수 있습니다.

grep -P '\t' *

트릭은 작은 따옴표 앞에 $ 기호를 사용하는 것 입니다. 절단 및 기타 도구 에도 적용됩니다 .

grep $'\t' sample.txt

'\ t'메타 문자를 grep과 함께 사용할 수 없었습니다. 그러나 두 가지 대체 솔루션을 찾았습니다.

  1. 사용 <Ctrl-V> <TAB>(Ctrl-V를 누르고 탭 입력)
  2. awk 사용하기 : foo | awk '/\t/'

에서 이 답변 우분투 질문에 :

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에만 해당 될 수 있습니다. 대안은 쉘, 편집기 또는 터미널에서 허용하는 경우 문자 그대로 탭을 삽입하는 것입니다.


이것은 정확히 당신이 찾고있는 것이 아니지만 귀하의 경우에는 효과가있을 수 있습니다

grep '[[:blank:]]'

에 해당

grep -P '[ \t]'

스페이스와 탭을 찾을 수 있습니다.

§ 캐릭터 클래스

참고로, 내 광고는 man grep없지만 여전히 작동합니다.

$ 남자 grep | 그렙 빈 | 화장실
      0 0 0

표현식 안에 탭을 문자 그대로 삽입하는 또 다른 방법은 $'\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`

echo를 사용하여 탭을 삽입하십시오 grep "$(echo -e \\t)"


기본적으로이를 해결하는 두 가지 방법이 있습니다.

  1. ( 권장 ) 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 -EBSD 호환 시스템에서)과 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 ...
    
  2. 탭 문자를 패턴으로 전달하십시오. 스크립트 파일을 편집 할 때 간단합니다.

    # 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 ...
    

grep "$(printf '\t')" Mac OS X에서 나를 위해 일했습니다.


gawk를 사용하고 필드 구분 기호를 탭 (\ t)으로 설정하고 필드 수를 확인하십시오. 1보다 크면 탭이 있습니다.

awk -F"\t" 'NF>1' 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을 작성하고 따옴표 유형 내에서 탭 키를 적어도 ksh에서 잘 작동합니다.

grep "  " *

ksh에서 나는 사용했다.

grep "[^I]" testfile

'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

편집 : 분명히 위의 내용은 탭을 찾기 위해 파일 내용을 볼 때만 유용합니다. --- 큰 스크립팅 세션의 일부로 탭을 처리하는 것이 유용한 경우 유용하지 않습니다.


이것은 AIX에서 잘 작동합니다. 포함하는 줄을 찾고 있습니다JOINED<\t>ACTIVE

voradmin cluster status | grep  JOINED$'\t'ACTIVE

 vorudb201   1       MEMBER(g) JOINED        ACTIVE
*vorucaf01   2       SECONDARY JOINED        ACTIVE

사용하고 싶을 수도 있습니다 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"

입력 할 수 있습니다

grep \ t foo

또는

grep '\ t'foo

foo 파일에서 탭 문자를 검색합니다. \ n 만 테스트했지만 다른 이스케이프 코드를 수행 할 수도 있습니다. 시간이 많이 걸리고 왜 원하는지 명확하지 않지만 zsh에서는 탭 문자를 시작으로 돌아가서 grep하고 따옴표로 묶을 수도 있습니다.


공백을 여러 번 찾으십시오. [[: space :]] *

grep [[: space :]] * '.' '.'

다음과 같은 것을 찾을 것입니다 :

'탭'..

작은 따옴표 ( ')이며 큰 따옴표 ( ")가 아닙니다.
이것은 grep에서 연결하는 방법입니다. =-)

참고 URL : https://stackoverflow.com/questions/1825552/grep-a-tab-in-unix



반응형