233 votes

Comment puis-je supprimer tout le texte après un caractère en bash ?

Comment puis-je supprimer tout le texte après un caractère, dans ce cas un deux-points (":"), en bash ? Puis-je aussi supprimer le deux-points ? Je n'ai aucune idée de comment faire.

397voto

Dennis Williamson Points 105818

En Bash (et ksh, zsh, dash, etc.), vous pouvez utiliser l'expansion de paramètres avec % pour supprimer des caractères de la fin de la chaîne ou # pour supprimer des caractères du début de la chaîne. Si vous utilisez un seul de ces caractères, la plus petite chaîne correspondante sera supprimée. Si vous doublez le caractère, la plus longue sera supprimée.

$ a='hello:world'

$ b=${a%:*}
$ echo "$b"
hello

$ a='hello:world:of:tomorrow'

$ echo "${a%:*}"
hello:world:of

$ echo "${a%%:*}"
hello

$ echo "${a#*:}"
world:of:tomorrow

$ echo "${a##*:}"
tomorrow

211voto

Eldad Mor Points 1951

Un exemple aurait été utile, mais si je vous ai bien compris, cela fonctionnerait :

echo "Bonjour: monde" | cut -f1 -d":"

Ceci va convertir Bonjour: monde en Bonjour.

22voto

Paige Lo Points 409
$ echo 'hello:world:again' |sed 's/:.*//'
hello

9voto

Kapmyc Points 41

Je connais quelques solutions:

# Nos données factices:
A=user:mail:password
  1. Avec awk et pipe:

    $ echo $A | awk -v FS=':' '{print $1}' user

  2. Par le biais de variables bash:

    $ echo ${A%%:*} user

  3. Avec pipe et sed:

    $ echo $A | sed 's#:.*##g' user

  4. Avec pipe et grep:

    $ echo $A | egrep -o '^[^:]+' user

  5. Avec pipe et cut:

    $ echo $A | cut -f1 -d\: user

7voto

cdhowie Points 62253
egrep -o '^[^:]*:'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X