grep un onglet dans UNIX
Comment puis-je grep
tabulation (\t) dans les fichiers sur la plate-forme Unix?
- utilisez simplement
grep "<Ctrl+V><TAB>"
, il fonctionne (si le temps le premier: typegrep "
puis appuyez sur Ctrl+V combinaison de touche, puis appuyez sur la touche de TABULATION, puis tapez"
et appuyez sur entrée, voilà!) - ctrl+v est une très MAUVAISE IDÉE ! ... oui, il peut travailler à partir de la console de commande, mais il peut ne PAS fonctionner POUR TAPER DANS UN SCRIPT (vous êtes à la merci de l'éditeur, par exemple-je utiliser mcedit et ctrl+v NE fonctionne PAS là-bas)
- Liées, mais pas un doublon: la Recherche pour les onglets, sans -P, à l'aide de 'grep'
- Voir aussi: askubuntu.com/questions/53071/... (lien ci-dessous)
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez GNU grep, vous pouvez utiliser le paquet Perl-style regexp:
-P
option.<Ctrl-V>
solution de SamK (stackoverflow.com/a/4691757/2516301) travaille plus viteL'astuce est d'utiliser $ signer avant unique citations. Il travaille également pour couper et d'autres outils.
zsh
ainsi, aussi loin que je peux dire. Pourriez-vous commenter ce que la sémantique de cette$
signe?$'\t'' '
. Un véritable exemple qui montre qu'il fonctionne aussi avec les poissons (pas seulement bash, ce qui n'est pas installé par défaut sur Android) estbusybox grep -oE '^nodev'$'\t''fuse$' /proc/filesystems
.zgrep $'\tPara\t' *
- trouvé "Para" entouré par des onglets via Ubuntu 14 bash\t
avec d'autres caractères, utilisez$'\t\|[;.,|]'
.xxd
, une autre façon d'examiner est:echo -n $'\t' | od -tx1
Je n'ai jamais réussi à faire le '\t' métacaractère travailler avec grep.
Cependant, j'ai trouvé deux solutions alternatives:
<Ctrl-V> <TAB>
(en appuyant sur Ctrl-V puis en tapant onglet)foo | awk '/\t/'
| awk '/\t/'
la solution pour tous les coquillages, les plates-formes et des systèmes.awk
fonctionne bien ici, mais dans quelques tests sur ma machine avec de très gros fichiers, il est environ 30% plus lent que d'utilisergrep -P
. Cela pourrait être banal et sans intérêt basé sur les cas d'utilisation, etawk
peut-être mieux tout simplement pour des raisons de lisibilité et de la portabilité.De cette réponse sur Ask Ubuntu:
Une façon est (c'est avec Bash)
-P
tourne sur les expressions régulières de Perl ainsi \t travail.En tant qu'utilisateur détendez-vous dit, il peut être spécifique à GNU grep. L'alternative est, littéralement, insérer un onglet si la coquille, l'éditeur ou le terminal le permet.
Une autre façon d'insérer l'onglet littéralement à l'intérieur de l'expression est d'utiliser le moins connu
$'\t'
devis en Bash:(Notez que si vous êtes correspondant pour les chaînes, vous pouvez l'utiliser avec l'option '-F' mode).
Parfois à l'aide de variables peut faire la notation un peu plus lisible et facile à gérer:
Ce n'est pas exactement ce que vous cherchez, mais pourrait fonctionner dans votre cas
Équivalent à
Donc il va trouver de l'Espace et Tabulation.
§ Les classes de personnage
Remarque, il n'est pas annoncé dans mon
man grep
, mais fonctionne encore-P
argument a été ajouté.L'utilisation de l'écho à insérer l'onglet pour vous
grep "$(echo -e \\t)"
Il ya essentiellement deux façons de l'aborder:
(Recommandé) Utiliser la syntaxe d'expression régulière pris en charge par la commande grep(1). Moderne grep(1) prend en charge deux formes de POSIX 1003.2 syntaxe regex: de base (obsolète) REs, et moderne REs. La syntaxe est décrite en détails sur la re_format(7) et les regex(7) pages de man, qui font partie de BSD et Linux, respectivement. La GNU grep(1) prend également en charge Perl-compatible REs comme prévu par le pcre(3) de la bibliothèque.
Dans la regex de la langue le symbole de tabulation est généralement codée par
\t
atome. L'atome est pris en charge par BSD expressions régulières étendues (egrep
,grep -E
sur BSD compatible avec le système), ainsi que Perl-compatible REs (pcregrep
, GNUgrep -P
).De base des expressions régulières et Linux étendue REs ont apparemment pas de support pour le
\t
. Veuillez consulter utilitaire UNIX page de manuel de savoir qui regex langue prise en charge (d'où la différence entre le sed(1), awk(1), et pcregrep(1) les expressions régulières).Par conséquent, sur Linux:
Sur BSD comme système:
Passer le caractère de tabulation dans le modèle. C'est simple, lorsque vous éditez un fichier de script:
Toutefois, lorsque vous travaillez dans un shell interactif, vous devrez peut-être appuyer sur la coquille et le terminal des capacités de taper le symbole approprié dans la ligne. Sur la plupart des terminaux cela peut être fait par
Ctrl
+V
combinaison de touches qui indique terminal pour traiter le prochain caractère littéralement (leV
est pour "mot à mot"):Quelques coquilles peuvent offrir un support avancé pour les commande de composition. Tels, dans bash(1) les mots de la forme
$'string'
sont spécialement traités:Veuillez noter cependant, tout en étant agréable dans une ligne de commande cela peut produire des problèmes de compatibilité lorsque le script sera déplacé vers une autre plate-forme. Aussi, soyez prudent avec les guillemets lors de l'utilisation de l'spéciaux, veuillez consulter bash(1) pour plus de détails.
Pour le Bourne shell (et pas seulement) le même comportement peut être émulées à l'aide de la substitution de commande augmentée par printf(1) pour construire la bonne regex:
grep "$(printf '\t')"
a fonctionné pour moi sur Mac OS Xutilisation gawk, définissez le séparateur de champ de tabulation (\t) et de vérifier le nombre de champs. Si plus de 1, alors il existe des onglets
awk /\t/
est suffisante pour l'op de la question.Un bon choix est d'utiliser sed comme grep' (comme expliqué dans ce classique sed tutoriel).
Exemples (travaux en bash, sh, ksh, csh,..):
+1 voie, qui fonctionne en ksh, tableau de bord, etc: l'utilisation de printf pour insérer ONGLET:
grep "$(printf '\t')" testfile.txt
La réponse est plus simple. Écrivez votre grep et à l'intérieur de la citation tapez la touche tab, il fonctionne bien au moins en ksh
Sur ksh j'ai utilisé
À l'aide de la 'sed-que-grep "méthode", mais en remplaçant les onglets avec un caractère visible de préférence personnelle est mon préféré de la méthode, car il montre clairement les deux fichiers qui contiennent la demande d'infos, et aussi l'endroit où il est placé à l'intérieur de lignes:
Si vous souhaitez faire usage de ligne/les infos de fichier, ou d'autres options de grep, mais aussi envie de voir le visible de remplacement pour le caractère de tabulation, vous pouvez y parvenir en
Comme un exemple:
EDIT: Évidemment, le ci-dessus est seulement utile pour visualiser le contenu du fichier pour localiser les onglets --- si l'objectif est de gérer les onglets de la partie de session de script, cela n'a pas d'utilité.
Cela fonctionne bien pour AIX. Je suis à la recherche pour les lignes contenant
JOINED<\t>ACTIVE
Vous pouvez utiliser
grep "$(echo -e '\t')"
Seule exigence est
echo
pour être capable de l'interprétation des séquences d'échappement.Ces alternative binaire méthodes d'identification sont totalement fonctionnels. Et, j'aime vraiment l'un de l'utilisation de awk, que je ne pouvais pas me rappeler la syntaxique utiliser avec un seul binaire caractères. Toutefois, il devrait également être possible d'affecter à une variable du shell d'une valeur dans une POSIX portable de la mode (c'est à dire TAB=
echo "@" | tr "\100" "\011"
), puis de les utiliser à partir de là, partout, dans une POSIX portable de la mode; ainsi (j'.e grep "$ONGLET" nom de fichier). Bien que cette solution fonctionne bien avec ONGLET, il fonctionne également bien d'autres caractères binaires, quand un autre souhaitée valeur binaire est utilisé dans l'affectation (au lieu de la valeur pour le caractère de TABULATION pour 'tr').L' $'\t' notation dans les autres réponses, c'est shell spécifiques -- il semble fonctionner en bash et zsh, mais n'est pas universelle.
NOTE: ce qui suit est pour le
fish
shell et ne fonctionne pas dans bash:Dans le
fish
shell, on peut utiliser un non cotées\t
, par exemple:Ou on peut utiliser l'hex ou unicode notations par exemple:
(ces notations sont utiles pour les plus ésotériques de caractères)
Depuis ces valeurs doivent être non cotées, on peut combiner les cotées et non cotées les valeurs par concaténation:
Vous pouvez taper
ou
à la recherche pour le caractère de tabulation dans le fichier foo. Vous pouvez probablement aussi d'autres codes d'échappement, bien que je ne l'ai testé \n. Même si c'est plutôt longue, et difficile de comprendre pourquoi vous voulez, en zsh vous pouvez également taper le caractère de tabulation, retour à la commencer, grep, et de joindre l'onglet avec des guillemets.
Chercher des espaces de nombreuses fois [[:space:]]*
grep [[:space:]]*'.".'
Trouverez quelque chose comme ceci:
'l'onglet' ..
Ce sont de simples citations ('), et pas de double (").
C'est comment vous faites concaténation grep. =-)