Kiedy szukam tabulatorów w pliku za pomocą (e) grep, używam tabu literalnego ( ^v + <tab>
). Nie mogę użyć \t
jako zamiennika tabulatorów w wyrażeniach regularnych. W przypadku np. Sed wyrażenie to działa bardzo dobrze.
Czy jest więc jakakolwiek możliwość zastosowania nielitetycznego zamiennika <tab>
i jakie są tła niedziałającego / nie interpretowanego \t
?
bash
grep
regex
posix-compliant
Lasall
źródło
źródło
Odpowiedzi:
grep używa wyrażeń regularnych zdefiniowanych przez POSIX . Z jakichkolwiek powodów POSIX nie zdefiniował
\t
jako tab.Masz kilka alternatyw:
powiedz grep, aby używał wyrażeń regularnych zdefiniowanych przez perl (perl ma
\t
jako tab):strona podręcznika ostrzega, że jest to funkcja „eksperymentalna”. przynajmniej
\t
wydaje się działać dobrze. ale bardziej zaawansowane funkcje wyrażenia regularnego Perla mogą nie.użyj printf, aby wydrukować znak tabulacji:
użyj dosłownego znaku tabulacji:
to znaczy: wpisz
grep "
, a następnie naciśnijctrl+v
, następnie naciśnijtab
, a następnie wpisz" foo.txt
. naciśnięciectrl+v
terminala powoduje, że następny klucz jest pobierany dosłownie. oznacza to, że terminal wstawi znak tabulacji zamiast wyzwalania jakiejś funkcji powiązanej z klawiszem tab.użyj funkcji cytowania ansi bash:
nie działa to we wszystkich powłokach.
użyj awk:
użyj sed:
Zobacz artykuł w Wikipedii na temat wyrażeń regularnych, aby uzyskać przegląd zdefiniowanych klas znaków w POSIX i innych systemach.
źródło
grep $'\t' foo.txt
(ale zwykle pisałbymfgrep
zamiastgrep
)grep "$(printf '\t')${myvar}" foo.txt
. Działa dobrze. Po kilku próbach nie udało mi się uruchomić ostatniego formularza.grep
nie mógł po cichu interpretować\t
jako tabulator? Czy POSIX wymaga, żeby to\t
oznaczało coś innego? Może powinien pasować tylko do literału,\
po którym następujet
?This is highly experimental and grep -P may warn of unimplemented features.
Prawdopodobnie nie jest dobrym pomysłem do użycia-P
w starszych systemach.printf
Wybór jest lepszyNie jest to dokładnie odpowiedź, którą chciałbyś usłyszeć, ale możliwe użycie sekwencji ucieczki zapewnia bash
(nie umieszczaj go w podwójnych cudzysłowach!).
źródło
grep $'\t'
.awk '/\t/'
to moje ulubione obejście:Wyjście:
a\t
.źródło
Zawsze można użyć szesnastkowego kodu ascii dla tab:
źródło