Comment puis-je imprimer tous les caractères jusqu'à un certain modèle(à l'exclusion du modèle lui-même) à l'aide de grep/awk/sed.
Par exemple
echo "abc-1234a :" | grep <do-something>
juste l'impression abc-1234a
Bienvenue sur StackOverflow! Cela sonne comme une XY Problème. vous vraiment essaye de faire?
Quel est le motif? Le colon? Vide-virgule? Faites-vous affaire avec une seule ligne d'entrée uniquement (comme avec ton echo), ou êtes-vous de traiter avec de multiples lignes de l'entrée? Si c'est un multi-ligne d'entrée, vous êtes à la recherche pour les lignes 1..N, où N est la première ligne qui contient le motif, en ignorant le reste, ou vous êtes à la recherche pour le segment initial de chaque ligne jusqu'à le modèle de la ligne?
Merci les gars! C'est les caractères de la première ligne de l'entrée avant de le côlon. L'entrée peut avoir plusieurs ligne.
Ajout d'une mise à jour de ma réponse à la poignée multi-ligne d'entrée.
Quel est le motif? Le colon? Vide-virgule? Faites-vous affaire avec une seule ligne d'entrée uniquement (comme avec ton echo), ou êtes-vous de traiter avec de multiples lignes de l'entrée? Si c'est un multi-ligne d'entrée, vous êtes à la recherche pour les lignes 1..N, où N est la première ligne qui contient le motif, en ignorant le reste, ou vous êtes à la recherche pour le segment initial de chaque ligne jusqu'à le modèle de la ligne?
Merci les gars! C'est les caractères de la première ligne de l'entrée avant de le côlon. L'entrée peut avoir plusieurs ligne.
Ajout d'une mise à jour de ma réponse à la poignée multi-ligne d'entrée.
OriginalL'auteur user1224949 | 2012-09-10
Vous devez vous connecter pour publier un commentaire.
Je pense qu'ils sont plus proche de ce que vous êtes, mais sans savoir ce que vous êtes vraiment essayer de l'atteindre, c'est difficile à dire.
... mais cela correspond également à des lignes qui n'ont pas de colon. Si vous ne souhaitez que des lignes avec des points, et vous doit utiliser uniquement grep, cela peut fonctionner:
Bien sûr, cela n'a de sens que si votre
echo "abc-1234a :"
est un exemple qui serait remplacer avec, éventuellement, plusieurs lignes d'entrée.Le plus petit outil que vous pouvez utiliser est probablement
cut
:Et
sed
est toujours disponible...Pour ce dernier, si vous ne souhaitez imprimer que les lignes qui incluent un colon, le modifier:
Heck, vous pouvez même le faire dans le plus pur bash:
Pour plus d'informations sur le
%%
bits, vous pouvezman bash
et de la recherche pour "Paramètre d'Expansion".Mise à JOUR:
Vous dit:
Les solutions avec
grep
ne sont pas probablement votre meilleur choix, alors, puisqu'ils seront également les données d'impression à partir de la suite des lignes qui pourraient inclure des virgules. Bien sûr, il existe de nombreuses façons de résoudre cette exigence. Nous allons commencer par un exemple de saisie:Vous pouvez utiliser plusieurs tuyaux, par exemple:
Ou vous pouvez utiliser sed pour traiter uniquement la première ligne:
Ou dire sed à la sortie après l'impression de la première ligne (qui est plus rapide que la lecture de l'ensemble du fichier):
Ou de faire la même chose mais seulement de montrer la sortie si les deux points a été trouvé (pour la sécurité):
Ou awk faire la même chose (comme les 3 derniers exemples, respectivement):
Ou en bash, pas de tuyaux à tous:
Recommande une légère modification:
sed '/:/{ s/:.*//; q;}'
plutôt que de supposer que seule la première ligne de l'entrée est intéressant.bon point, même si l'OP a dit (dans un commentaire sur la question) que le nom du champ n'est disponible que dans la première ligne de l'entrée.
egrep -o '^[^:]+'
==grep -o '^[^:]\+'
Pas nécessairement. Même si c'est vrai pour GNU grep, il n'est pas vrai pour toutes les RÉ analyseurs. Comparez votre grep avec la théorie (mais pas) équivalent
sed -e 's/^\([^:]\+\).*/\1/'
. GNU sed se comporte de la même manière que GNU grep, mais sur FreeBSD, OS x, Solaris, etc, il ne le fait pas. Fait intéressant, ce comportement est même soutenu dans la documentation de Linux -- à partir de laregex(7)
page de man,'|', '+', and '?' are ordinary characters and there is no equivalent for their functionality.
avant-dernier paragraphe de la section DESCRIPTION.OriginalL'auteur ghoti