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

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

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

4 ответа

Решение

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

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

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

    grep -P "\t" foo.txt
    

    Страница man предупреждает, что это "экспериментальная" функция. по крайней мере \t Кажется, работает нормально. но более продвинутые возможности Perl Regex могут и не быть.

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

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

    grep "^V<tab>" foo.txt
    

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

  • используйте особую цитату в 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
Другие вопросы по тегам