grep вкладка в UNIX - PullRequest
       115

grep вкладка в UNIX

379 голосов
/ 01 декабря 2009

Как мне grep вкладка (\ t) в файлах на платформе Unix?

Ответы [ 22 ]

346 голосов
/ 01 декабря 2009

Если вы используете GNU grep, вы можете использовать регулярное выражение в стиле Perl:

grep -P '\t' *
282 голосов
/ 17 апреля 2011

Хитрость заключается в использовании знака $ перед одинарными кавычками. Это также работает для cut и других инструментов.

grep $'\t' sample.txt
81 голосов
/ 14 января 2011

Мне никогда не удавалось заставить метасимвол '\ t' работать с grep. Однако я нашел два альтернативных решения:

  1. Использование <Ctrl-V> <TAB> (нажмите Ctrl-V, затем нажмите Tab)
  2. Использование awk: foo | awk '/\t/'
41 голосов
/ 18 января 2016

С этот ответ на Ask Ubuntu:

Скажите grep использовать регулярные выражения, как определено в Perl (Perl имеет \t как вкладка):

grep -P "\t" <file name>

Используйте буквенный символ табуляции:

grep "^V<tab>" <filename>

Используйте printf, чтобы напечатать символ табуляции для вас:

grep "$(printf '\t')" <filename>
29 голосов
/ 01 декабря 2009

Один способ (это с Bash)

grep -P '\t'

-P включает регулярные выражения Perl, поэтому \ t будет работать.

Как говорит пользователь unwind , это может быть связано с GNU grep. Альтернативой является буквально вставить туда вкладку, если оболочка, редактор или терминал разрешат это.

10 голосов
/ 15 апреля 2014

Это не совсем то, что вы ищете, но может работать в вашем случае

grep '[[:blank:]]'

Эквивалент

grep -P '[ \t]'

Так он найдет пробел и таб.

& секта; Классы персонажей

Обратите внимание, это не объявлено в моем man grep, но все еще работает

$ man grep | grep blank | wc
      0       0       0
8 голосов
/ 06 декабря 2017

Еще один способ вставить вкладку буквально в выражение - использовать менее известную цитату $'\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`
6 голосов
/ 23 октября 2017

Существует два основных способа решения этой проблемы:

  1. ( Рекомендуется ) Использовать синтаксис регулярного выражения, поддерживаемый grep (1). Современный grep (1) поддерживает две формы синтаксиса регулярных выражений POSIX 1003.2: базовые (устаревшие) RE и современные RE. Синтаксис подробно описан на man-страницах re_format (7) и regex (7), которые являются частью систем BSD и Linux соответственно. GNU grep (1) также поддерживает Perl-совместимые RE, предоставляемые библиотекой pcre (3).

    На языке регулярных выражений символ табуляции обычно кодируется \t атомом. Атом поддерживается расширенными регулярными выражениями BSD (egrep, grep -E в BSD-совместимой системе), а также совместимыми с Perl RE (pcregrep, GNU grep -P).

    Как базовые регулярные выражения, так и расширенные RE Linux, по-видимому, не поддерживают \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 для "дословно"):

    $ grep '<Ctrl>+<V><TAB>' FILE ...
    

    Некоторые оболочки могут предлагать расширенную поддержку для набора команд. Так, в bash (1) слова вида $'string' обрабатываются специально:

    bash$ grep $'\t' FILE ...
    

    Пожалуйста, обратите внимание, что, будучи хорошим в командной строке, это может вызвать проблемы совместимости, когда скрипт будет перемещен на другую платформу. Кроме того, будьте осторожны с кавычками, когда используете специальные предложения, пожалуйста, обратитесь к bash (1) для деталей.

    Для оболочки Bourne (и не только) такое же поведение можно эмулировать, используя подстановку команд, дополненную printf (1), для создания правильного регулярного выражения:

    $ grep "`printf '\t'`" FILE ...
    
6 голосов
/ 09 мая 2014

Используйте echo, чтобы вставить вкладку для вас grep "$(echo -e \\t)"

4 голосов
/ 03 марта 2017

grep "$(printf '\t')" работал для меня на Mac OS X

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...