Grep a вкладка в UNIX

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

Ответ 1

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

$ grep -P '\t' *

Ответ 2

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

$ grep $'\t' sample.txt

Ответ 3

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

  • Использование <Ctrl-V> <TAB> (нажатие Ctrl-V, набрав вкладку)
  • Использование awk: foo | awk '/\t/'

Ответ 4

Из этого ответа на Ask Ubuntu:

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

grep -P "\t" <file name>

Используйте символ символа в буквах:

grep "^V<tab>" <filename>

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

grep "$(printf '\t')" <filename>

Ответ 5

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

grep -P '\t'

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

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

Ответ 6

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

grep '[[:blank:]]'

Эквивалентно

grep -P '[ \t]'

Итак, он найдет Space и Tab.

& sect; Классы символов

Заметьте, он не объявлен в моем man grep, но все еще работает

$ man grep | grep blank | wc
      0       0       0

Ответ 7

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

Ответ 8

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

Ответ 9

В основном есть два способа решить эту проблему:

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

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

    Оба базовых регулярных выражения и расширенные версии Linux, по-видимому, не поддерживают \t. Пожалуйста, обратитесь к странице служебных программ UNIX, чтобы узнать, какой язык регекса он поддерживает (отсюда и разница между командами sed (1), awk (1) и pcregrep (1)).

    Поэтому в Linux:

    $ grep -P '\t' FILE ...
    

    В BSD подобная система:

    $ egrep '\t' FILE ...
    $ grep -E '\t' FILE ...
    
  • Передайте символ табуляции в шаблон. Это просто, когда вы редактируете файл script:

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

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

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

    $ grep "`printf '\t'`" FILE ...
    

Ответ 10

Хорошим выбором является использование sed как 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

Ответ 11

+1 способ, который работает в ksh, тире и т.д.: используйте printf для вставки TAB:

grep "$(printf 'BEGIN\tEND')" testfile.txt

Ответ 12

используйте gawk, установите разделитель полей на вкладку (\ t) и проверьте количество полей. Если более 1, то есть /- вкладки

awk -F"\t" 'NF>1' file

Ответ 13

Ответ проще. Напишите свой grep и в типе цитаты введите ключ вкладки, он работает хорошо, по крайней мере, в ksh

grep "  " *

Ответ 14

В ksh я использовал

grep "[^I]" testfile

Ответ 15

Это хорошо работает для AIX. Я ищу строки, содержащие JOINED<\t>ACTIVE

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

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

Ответ 16

Использование метода "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

EDIT: Очевидно, что вышеизложенное полезно только для просмотра содержимого файла для поиска вкладок --- если целью является обработка вкладок как часть более крупного сеанса сценариев, это не служит никакой полезной цели.

Ответ 17

Возможно, вы захотите использовать grep "$(echo -e '\t')"

Только требование echo должно быть способно интерпретировать обратные слэши.

Ответ 18

Эти альтернативные бинарные методы идентификации полностью функциональны. И мне очень нравится тот, который использует awk, поскольку я не мог полностью запомнить синтаксическое использование с одиночными двоичными символами. Однако также должно быть возможно назначить переменную оболочки значение в переносном режиме POSIX (т.е. TAB = echo "@" | tr "\100" "\011"), а затем использовать ее повсюду в переносном режиме POSIX; также (например, grep "$ TAB" filename). Хотя это решение хорошо работает с TAB, оно также хорошо работает с другими двоичными символами, когда в присваивании используется другое желаемое двоичное значение (вместо значения для символа TAB для "tr" ).

Ответ 19

Обозначение $'\ t', заданное в других ответах, является специфичным для оболочки - оно работает в bash и zsh, но не является универсальным.

ПРИМЕЧАНИЕ. Ниже приведена оболочка fish и не работает в bash:

В оболочке fish можно использовать unquoted \t, например:

grep \t foo.txt

Или можно использовать шестнадцатеричные или уникодовые обозначения, например:

grep \X09 foo.txt
grep \U0009 foo.txt

(эти обозначения полезны для более эзотерических символов)

Поскольку эти значения должны быть не кавычками, можно комбинировать кавычки и некотируемые значения путем конкатенации:

grep "foo"\t"bar"

Ответ 20

Вы можете ввести

grep \t foo

или
grep '\t' foo

для поиска символа табуляции в файле foo. Возможно, вы также можете использовать другие коды эвакуации, хотя я тестировал только \n. Хотя это довольно трудоемко и непонятно, зачем вам нужно, в zsh вы также можете ввести символ табуляции, вернуться к началу, grep и заключить вкладку с кавычками.

Ответ 21

Ищите пробелы много раз [[: space:]] *

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

найдет что-то вроде этого:

'вкладка..

Это одинарные кавычки ('), а не double (").
Так вы делаете конкатенацию в grep. = -)