Как выполнить поиск вкладок, не используя буквальные вкладки и почему \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