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

105

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

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

    
задан Lasall 14.07.2011 в 11:59
источник

5 ответов

151

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

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

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

    grep -P "\t" foo.txt
    
  • используйте printf для печати символа табуляции для вас:

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

    grep "^V<tab>" foo.txt
    

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

  • , если вы используете bash, вы можете использовать ansi c quoting :

    grep $'\t' foo.txt
    

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

ответ дан lesmana 14.07.2011 в 15:04
источник
12

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

command | grep $'\t'

(не помещайте его в двойные кавычки!).

    
ответ дан enzotib 14.07.2011 в 14:15
1

awk '/\t/' - мое любимое решение:

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

Выход: a\t .

    
ответ дан Ciro Santilli 包子露宪 六四事件 法轮功 28.08.2016 в 11:15
1

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

$ echo "one"$'\t'"two" > input.txt                                 

$ grep -P "\x9" input.txt                                          
one two

$ grep $'\x9' input.txt                                            
one two
    
ответ дан Sergiy Kolodyazhnyy 03.07.2017 в 17:04
-4

regex определяет, что [[: пробел:]] выполняет поиск как пробелов, так и вкладок. Вы также можете попробовать:

egrep "[:blank:]{2,5}

, это найдет большинство вкладок (так как в основном вкладка занимает 2-5 пробелов.

, используя \ t в sed, вероятно, является усовершенствованием sed.     

ответ дан Goez 14.07.2011 в 13:52