Когда я ищу вкладки в файле с помощью (e) grep, я использую буквенную вкладку ( ^v + <tab>
). Я не могу использовать \t
в качестве замены для вкладок в регулярных выражениях. Например, у sed это выражение работает очень хорошо.
Так есть ли возможность использовать нелитеральную замену <tab>
и каковы предпосылки для неработающего / не интерпретированного \t
?
bash
grep
regex
posix-compliant
Lasall
источник
источник
Ответы:
grep использует регулярные выражения, определенные в POSIX . По тем или иным причинам POSIX не определен
\t
как таб.У вас есть несколько вариантов:
скажите grep использовать регулярные выражения, как определено в perl (perl имеет
\t
as tab):Страница man предупреждает, что это «экспериментальная» функция. по крайней мере,
\t
кажется, работает нормально. но более продвинутые возможности Perl Regex могут и не быть.используйте printf, чтобы напечатать символ табуляции для вас:
используйте буквенный символ табуляции:
то есть: введите
grep "
, затем нажмитеctrl+v
, затем нажмитеtab
, затем введите" foo.txt
. нажатиеctrl+v
в терминале приводит к тому, что следующая клавиша принимается дословно. это означает, что терминал будет вставлять символ табуляции вместо вызова какой-либо функции, связанной с клавишей табуляции.используйте особую цитату в bash:
это работает не во всех оболочках.
используйте awk:
используйте sed:
См. Статью в Википедии о регулярных выражениях для обзора определенных классов символов в POSIX и других системах.
источник
grep $'\t' foo.txt
(но я бы обычно писалfgrep
вместоgrep
)grep "$(printf '\t')${myvar}" foo.txt
. Работало нормально. После нескольких попыток я не смог заставить работать последнюю форму.grep
не может молча интерпретировать\t
как табуляцию? POSIX требует, чтобы это\t
означало что-то еще? Возможно, он должен соответствовать только литералу с\
последующимt
?This is highly experimental and grep -P may warn of unimplemented features.
Вероятно, не очень хорошая идея использовать-P
в устаревших системах.printf
Выбор лучшеЭто не совсем тот ответ, который вы хотели бы услышать, но возможное использование escape-последовательностей обеспечивается bash
(не помещайте это в двойные кавычки!).
источник
grep $'\t'
.awk '/\t/'
мой любимый обходной путь:Выход:
a\t
.источник
Всегда можно прибегнуть к использованию шестнадцатеричного кода ascii для табуляции:
источник