Как использовать grep для вкладок без использования буквальных вкладок и почему \ t не работает?

Когда я ищу вкладки в файле с помощью (e)grep, я использую вкладку litteral (^v + <tab>). Я не могу использовать \t в качестве замены табуляции в регулярных выражениях. Например, с sed это выражение работает очень хорошо.

Итак, есть ли какая-либо возможность использовать не-литеральную замену для <tab> и каковы предпосылки для нерабочего / не интерпретируемого \t ?

grep использует регулярные выражения, определенные POSIX. По каким-либо причинам POSIX не определил \t как вкладка.

У вас есть несколько альтернатив:

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

    grep -P "\t" foo.txt

    справочная страница предупреждает, что это "экспериментальная" функция. по крайней мере \t кажется, все работает нормально. но более продвинутые функции регулярных выражений perl могут этого не делать.

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

    grep "$(printf '\t')" foo.txt
  • используйте буквальный символ табуляции:

    grep "^V<tab>" foo.txt

    то есть: введите grep ", затем нажмите ctrl+v, затем нажмите tab, затем введите " foo.txt. нажатие ctrl+v в терминале приводит к тому, что следующий ключ будет записан дословно. это означает, что терминал вставит символ табуляции вместо запуска какой-либо функции, привязанной к клавише табуляции.

  • используйте цитирование ansi c особенность bash:

    grep $'\t' foo.txt

    это работает не во всех оболочках.

  • используйте awk:

    awk '/\t/'
  • используйте sed:

    sed -n '/\t/p'

Посмотрите на статья в википедии о регулярных выражениях для получения общего обзора определенных классов символов в POSIX и других системах.

Это не совсем тот ответ, который вы хотели бы услышать, но возможное использование escape-последовательностей обеспечивается bash

command | grep $'\t'

(не заключайте его в двойные кавычки!).

awk '/\t/' это мой любимый обходной путь:

printf 'a\t\nb' | awk '/\t/'

Выход: a\t.

Всегда можно прибегнуть к использованию шестнадцатеричного кода ascii для табуляции:

$ echo "one"$'\t'"two" > input.txt                                 $ grep -P "\x9" input.txt                                          one two$ grep $'\x9' input.txt                                            one two