Lorsque je recherche des onglets dans un fichier avec (e) grep, j'utilise l'onglet littéral ( ^v + <tab>
). Je ne peux pas utiliser \t
en remplacement des tabulations dans les expressions régulières. Avec par exemple sed cette expression fonctionne très bien.
Donc, est-il possible d'utiliser un remplacement non littéral pour <tab>
et quels sont les fonds pour un non-travail / non interprété \t
?
bash
grep
regex
posix-compliant
Lasall
la source
la source
Réponses:
grep utilise des expressions régulières définies par POSIX . Pour quelque raison que ce soit, POSIX n'a pas défini
\t
comme tabVous avez plusieurs alternatives:
Dites à grep d'utiliser les expressions régulières définies par perl (perl a
\t
pour tabulation):la page de manuel indique qu'il s'agit d'une fonctionnalité "expérimentale". au moins
\t
semble bien fonctionner. mais les fonctionnalités plus avancées de perl regex pourraient ne pas l'être.utilisez printf pour imprimer un caractère de tabulation pour vous:
utilisez le caractère de tabulation littéral:
c'est-à-dire: tapez
grep "
, puis appuyez surctrl+v
, puis appuyez surtab
, puis tapez" foo.txt
. en appuyantctrl+v
dans le terminal, la prochaine clé sera prise mot pour mot. cela signifie que le terminal insérera un caractère de tabulation au lieu de déclencher une fonction liée à la touche de tabulation.utilisez la fonction de citation ansi c de bash:
cela ne fonctionne pas dans tous les coquillages.
utiliser awk:
utiliser sed:
Consultez l' article de Wikipédia sur les expressions régulières pour obtenir une vue d'ensemble des classes de caractères définies dans POSIX et d'autres systèmes.
la source
grep $'\t' foo.txt
(mais j'écrirais habituellement à lafgrep
place degrep
)grep "$(printf '\t')${myvar}" foo.txt
. Cela a bien fonctionné. Avec quelques essais, je ne pouvais pas obtenir le dernier formulaire pour travailler.grep
ne pourrait pas interpréter silencieusement\t
comme onglet? POSIX exige-t-il que\t
cela veuille dire autre chose? Peut-être est-ce supposé correspondre à un littéral\
suivi d'unt
?This is highly experimental and grep -P may warn of unimplemented features.
Probablement pas une bonne idée à utiliser-P
dans les systèmes hérités. Leprintf
choix est meilleurCe n'est pas exactement la réponse que vous voudriez entendre, mais bash fournit une possibilité d'utilisation de séquences d'échappement.
(ne le mettez pas entre guillemets!).
la source
grep $'\t'
.awk '/\t/'
est ma solution préférée:Sortie:
a\t
.la source
On peut toujours avoir recours à l’ascii hex-code pour onglet:
la source