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

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

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

146
задан 13 May 2016 в 11:24

4 ответа

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

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

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

    grep -P "\t" foo.txt
    

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

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

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

    grep "^V<tab>" foo.txt
    

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

  • используйте ansi c заключение в кавычки функции удара:

    grep $'\t' foo.txt
    

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

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

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

    sed -n '/\t/p'
    

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

208
ответ дан 22 November 2019 в 22:53

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

command | grep $'\t'

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

13
ответ дан 22 November 2019 в 22:53

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

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

Вывод: a\t.

2
ответ дан 22 November 2019 в 22:53

Можно всегда обращаться к использованию шестнадцатеричного кода ASCII для вкладки:

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

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

$ grep $'\x9' input.txt                                            
one two
1
ответ дан 22 November 2019 в 22:53

Другие вопросы по тегам:

Похожие вопросы: