J'ai un fichier texte sur Linux dont le contenu est comme ci-dessous:
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
Je veux obtenir le contenu avant les deux points comme ci-dessous:
help.helloworld.com
dev.helloworld.com
Comment puis-je faire cela dans le terminal?
text-processing
grep
Gabrial Johnas
la source
la source
grep
utilitaire est utilisé pour rechercher des lignes correspondant à des expressions régulières. Vous pouvez éventuellement l'utiliser ici, mais il serait plus approprié d'utiliser un outil qui extrait les données des champs en fonction d'un délimiteur, comme l'cut
utilitaire.grep
c'est le bon outil pour résoudre le problème réel. problème.Réponses:
C'est pour ça
cut
:Vous venez de définir le délimiteur
:
avec-d:
et lui dites de n'imprimer que le 1er champ (-f1
).la source
Ou une alternative:
Cela renvoie tous les caractères commençant au début de chaque ligne (
^
) qui ne sont pas des deux-points ([^:]*
).la source
Je recommanderais certainement
awk
:Utilise
:
comme séparateur de champ et imprime le premier champ.la source
réponse mise à jour
Considérant le fichier suivant
file.txt
:Vous pouvez utiliser
sed
pour tout supprimer après les deux points:Cela fonctionne pour tous les cas d'angle soulignés dans les commentaires - si cela se termine par deux points, ou s'il n'y a pas de deux points, bien que ceux-ci ne soient pas mentionnés dans la question elle-même. Merci à @Rakesh Sharma, @mirabilos et @Freddy pour leurs commentaires. Répondre aux questions est un excellent moyen d'apprendre.
la source
sed -e 's/:.*//' file.txt
est une autre façon avec Posix sed.sed -ne 'y/:/\n/;P' file.txt
peut également être utilisé..+
to.*
if
dans las///p
syntaxe, vous devez modifier votre regex pour prendre soin de lignes sans côlons, quelque chose commesed -nEe 's/([^:]*)(:.*|)/\1/p'
. Notez que cela nécessiteGNU sed
mais puisque de toute façon vous êtes sur GNU sed donc cela ne devrait pas avoir d'importance.sed -n '/:/s/^\([^:]*\):.*$/\1/p
(ajouter--posix
si vous utilisez GNU sed, juste pourVoulez-vous dire comme ça:
Production:
la source
echo foo:bar:baz | grep -oP '.*(?=:)'
. Cela fonctionnera pour l'exemple du PO, mais pas pour le cas général décrit dans la question.Vous pouvez y parvenir avec la gestion des chaînes bash, en supprimant la correspondance la plus longue de la chaîne directement pour chaque ligne lue comme suit:
Cela peut être une alternative utile si vous analysez le fichier dans un script shell (bien que je soupçonne que l'utilisation de cut soit plus efficace).
la source
En shell POSIX pur sans utiliser de commandes externes, je ferais:
la source