Как вкладка grep
(\ t) в файлах на платформе Unix?
Grep a вкладка в 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.
Заметьте, он не объявлен в моем 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
, GNUgrep -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. = -)