Как вкладка grep
(\ t) в файлах на платформе Unix?
Если вы используете GNU grep, вы можете использовать regexp в стиле Perl:
$ grep -P '\t' *
Хитрость заключается в использовании знака $перед кавычками single. Он также работает для вырезания и других инструментов.
$ grep $'\t' sample.txt
zsh
. Не могли бы вы прокомментировать, что такое семантика этого знака $
?
Мне никогда не удавалось использовать метасимвол '\ t' с grep. Однако я нашел два альтернативных решения:
<Ctrl-V> <TAB>
(нажатие Ctrl-V, набрав вкладку)foo | awk '/\t/'
| awk '/\t/'
Решение | awk '/\t/'
будет работать для всех оболочек, платформ и систем.
Из этого ответа на Ask Ubuntu:
Скажите 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]'
Итак, он найдет Space и Tab.
Заметьте, он не объявлен в моем man grep
, но все еще работает
$ man grep | grep blank | wc 0 0 0
-P
.
Используйте эхо, чтобы вставить вкладку для вас grep "$(echo -e \\t)"
В основном есть два способа решить эту проблему:
(Рекомендуется) Используйте синтаксис регулярных выражений, поддерживаемый 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 ...
grep "$(printf '\t')"
работал у меня в Mac OS X
Хорошим выбором является использование 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
+1 способ, который работает в ksh, тире и т.д.: используйте printf для вставки TAB:
grep "$(printf 'BEGIN\tEND')" testfile.txt
grep "$(printf '\t')" testfile.txt
Обозначение $'\ t', заданное в других ответах, является специфичным для оболочки - оно работает в bash и zsh, но не является универсальным.
ПРИМЕЧАНИЕ. Ниже приведена оболочка fish
и не работает в bash:
В оболочке fish
можно использовать unquoted \t
, например:
grep \t foo.txt
Или можно использовать шестнадцатеричные или уникодовые обозначения, например:
grep \X09 foo.txt
grep \U0009 foo.txt
(эти обозначения полезны для более эзотерических символов)
Поскольку эти значения должны быть не кавычками, можно комбинировать кавычки и некотируемые значения путем конкатенации:
grep "foo"\t"bar"
Эти альтернативные бинарные методы идентификации полностью функциональны. И мне очень нравится тот, который использует awk, поскольку я не мог полностью запомнить синтаксическое использование с одиночными двоичными символами. Однако также должно быть возможно назначить переменную оболочки значение в переносном режиме POSIX (т.е. TAB = echo "@" | tr "\100" "\011"
), а затем использовать ее повсюду в переносном режиме POSIX; также (например, grep "$ TAB" filename). Хотя это решение хорошо работает с TAB, оно также хорошо работает с другими двоичными символами, когда в присваивании используется другое желаемое двоичное значение (вместо значения для символа TAB для "tr" ).
Возможно, вы захотите использовать grep "$(echo -e '\t')"
Только требование echo
должно быть способно интерпретировать обратные слэши.
Использование метода "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: Очевидно, что вышеизложенное полезно только для просмотра содержимого файла для поиска вкладок --- если целью является обработка вкладок как часть более крупного сеанса сценариев, это не служит никакой полезной цели.
Это хорошо работает для AIX. Я ищу строки, содержащие JOINED<\t>ACTIVE
voradmin cluster status | grep JOINED$'\t'ACTIVE
vorudb201 1 MEMBER(g) JOINED ACTIVE
*vorucaf01 2 SECONDARY JOINED ACTIVE
В ksh я использовал
grep "[^I]" testfile
Ответ проще. Напишите свой grep и в типе цитаты введите ключ вкладки, он работает хорошо, по крайней мере, в ksh
grep " " *
используйте gawk, установите разделитель полей на вкладку (\ t) и проверьте количество полей. Если более 1, то есть /- вкладки
awk -F"\t" 'NF>1' file
Вы можете ввести
grep \t foo
grep '\t' foo
для поиска символа табуляции в файле foo. Возможно, вы также можете использовать другие коды эвакуации, хотя я тестировал только \n. Хотя это довольно трудоемко и непонятно, зачем вам нужно, в zsh вы также можете ввести символ табуляции, вернуться к началу, grep и заключить вкладку с кавычками.
Ищите пробелы много раз [[: space:]] *
grep [[: space:]] * '.' '.'
найдет что-то вроде этого:
'вкладка..
Это одинарные кавычки ('), а не double (").
Так вы делаете конкатенацию в grep. = -)
grep "<Ctrl+V><TAB>"
, это работает (если в первый раз: введитеgrep "
затем нажмите комбинацию клавиш Ctrl + V, затем нажмите клавишу TAB, затем введите"
и нажмите ввод, вуаля!)