Très nouveau pour UNIX mais pas nouveau pour la programmation. Utilisation de Terminal sur MacBook. Dans le but de gérer et de rechercher des listes de mots pour la construction de mots croisés, j'essaie de me familiariser avec la commande Grep et ses variantes. Cela semble assez simple, mais se bloquer dès le début avec ce que je pensais être un cas simple.
Quand j'entre
grep "^COW" masternospaces.txt
J'obtiens ce que je veux: une liste de tous les mots commençant par COW.
Mais quand j'entre
grep "COW$" masternospaces.txt
Je m'attends à obtenir une liste de mots se terminant par COW (il y en a beaucoup), et rien n'est retourné du tout.
Le fichier est un fichier texte brut, avec chaque ligne juste un mot (ou une expression de mot sans espaces) dans toutes les majuscules.
Une idée de ce qui pourrait se passer ici?
hexdump
pour vérifier exactement comment vos fins de ligne sont formatées. Je vous suggère d' utiliser le format mon préféré:hexdump -e '"%08_ad (0x%08_ax) "8/1 "%02x "" "8/1 "%02x "' -e '" "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
. Avec la sortie, vérifiez les fins de ligne:0a
->LF
,0d
->CR
.Réponses:
Comme l'a mentionné @steeldriver, le problème est probablement dû à un style de fin de ligne différent de celui
grep
attendu.Pour vérifier les fins de ligne
Vous pouvez utiliser
hexdump
pour vérifier exactement comment vos fins de ligne sont formatées. Je vous suggère d'utiliser mon format préféré:Avec la sortie, vérifiez les fins de ligne:
0a
->LF
,0d
->CR
. Un exemple très rapide donnerait quelque chose comme ceci:Notez les fins de ligne au format dos:
0d 0a
.Pour modifier les fins de ligne
Vous pouvez voir ici ou ici pour différentes méthodes de modification des fins de ligne à l'aide de divers outils, mais pour une chose ponctuelle, vous pouvez toujours utiliser vi / vim:
Grep sans rien changer
Si vous voulez juste
grep
faire correspondre quelque soit la fin de ligne, vous pouvez toujours spécifier des fins de ligne comme ceci:Si une ligne vierge s'affiche, vous pouvez vérifier que vous avez bien correspondu à quelque chose en utilisant l'
-v
option decat
:Mon préféré
Vous pouvez également à la fois grep et standardiser la sortie en utilisant
sed
:où
^M
est obtenu en tapantCtrl-V Ctrl-M
sur votre clavier.J'espère que cela t'aides!
la source
[[:cntrl:]]
@ user43791 suggéré et il ne correspond toujours à rien pour moi. Cela n'a aucun sens. J'utilise GNU grep 2.20 et analyse la sortie de nDPI qui a été écrite dans un fichier textecat -v yourfile.ext
, que voyez-vous?file
.Bien que vous puissiez utiliser la syntaxe RegEx «standard» avec grep (comme dans la réponse de @ user43791 ), grep a également d'autres identifiants pour signifier les limites d'entrée.
Les matchers pour le début et la fin de la ligne entière sont
\`
(backtick) (au lieu de^
) et\'
(apostrophe) (au lieu de$
).Donc, pour votre commande d'origine, vous utiliseriez:
grep "COW\'" masternospaces.txt
Note latérale: Il est également important de noter cela
?
et+
sera traité littéralement à moins que vous ne leur échappiez en utilisant\?
et\+
en faire leurs homologues de sélection de style RegEx.Source:
grep
syntaxe des expressions régulièresla source
Une autre façon de supprimer l'
\r
avant le grep:J'aime que c'est très clair car je ne me souviens pas de choses comme
[[:cntrl:]]
longtemps.la source
"COW $" lorsque bash a défini le paramètre pour grep, il a été interprété comme "COW", où "$" est traité comme "", car $ est un simbole d'échappement. quand rien n'a été copié par $, il est interprété comme une chaîne vide par le shell bash, vous devriez donc utiliser grep 'COW $' masternospaces.txt à la place.
la source
$
, il serait laissé seul par bash et utilisé par grep. Voyez par vous-même:echo "COW$"
- la$
volonté sera toujours là.Dans BSD grep, vous devez échapper "$" et mettre votre chaîne entre guillemets:
la source
$
ne sera pas spécial pour le shell, car le truc qui le suit n'est pas un nom de variable de shell valide. L'utilisation de guillemets simples autour de chaînes statiques est une meilleure idée, mais ne fera aucune différence ici.