Bonjour à tous (toutes),
Je ne suis pas un grand spécialiste de la programmation du shell (/bin/bash) et je bute sur la résolution suivante:
je cherche à extraire d'une chaîne, l'ensemble de la chaîne sauf le premier champ et sans le séparateur. la chaine pouvant être constituée de 2 à n champs..
ex:
[code]
echo "un deux trois quatre" | awk '{ $1=""; print $0;}'
deux trois quatre
[/code]
le problème est que je ne veux pas récupérer le premier séparateur et que d'autre part la chaine peut être constituée de 2 à n champs (ex: "Un deux", "Un deux trois", "Un deux trois ..."
je voudrais éviter d'utiliser la fonction split est-ce possible ?
# cut ?
Posté par Old Geek . Évalué à 7.
deux trois quatre
[^] # Re: cut ?
Posté par xylo (site web personnel) . Évalué à 2.
Existe-t-il un (ou plusieurs) site(s) sympa sur le bash ?
[^] # Re: cut ?
Posté par Ellendhel (site web personnel) . Évalué à 1.
Je ne sais pas si cela correspondra à ta définition de "sympa", mais il existe un guide avancé d'écriture de scripts Bash :
- français : http://abs.traduc.org/abs-5.1-fr/
- anglais : http://www.faqs.org/docs/abs/HTML/index.html
[^] # pour le fun :
Posté par Old Geek . Évalué à 4.
deux trois quatre
ou
echo "un deux trois quatre" |sed 's/[^ ]* //'
ou
echo "un deux trois quatre" | awk ' sub(/^[^ ]* /,"",$0)'
[^] # en pur shell
Posté par Old Geek . Évalué à 4.
echo ${CHAINE#[^ ]* }
deux trois quatre
[^] # grep
Posté par Old Geek . Évalué à 3.
echo "un deux trois quatre" | grep -Eo "([^ ]* ){2}[a-z]*$"
deux trois quatre
[^] # Re: en pur shell
Posté par barmic . Évalué à 3.
pas de programme extérieur & compacte
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
[^] # Re: en pur shell
Posté par Old Geek . Évalué à 3.
fearan à même trouvé encore plus court :
CHAINE="un deux trois quatre"
echo ${CHAINE#* }
# Si tu veux vraiment utiliser AWK
Posté par Cyril Lavier . Évalué à 2.
Mais bon, cut est vraiment plus adapté pour ça que AWK, qu'il faut limite réserver à des utilisations plus poussées.
Merci.
[^] # Re: Si tu veux vraiment utiliser AWK
Posté par totof2000 . Évalué à 2.
echo "un deux trois quatre" |awk '{sub($1 FS,"");print}'
Si on remplace le séparateur de champ :
echo "un;deux;trois;quatre" |awk -F\; '{sub($1 FS,"");print }'
[^] # Re: Si tu veux vraiment utiliser AWK
Posté par totof2000 . Évalué à 3.
# avec une boucle for ?
Posté par eric gerbier (site web personnel) . Évalué à 2.
[^] # Re: avec une boucle for ?
Posté par Cyril Lavier . Évalué à 2.
echo "un deux trois quatre" | awk '{ for (i = 2; i <= NF; i++)print $i}' | tr '\n' ' ' | sed "s/ $/\n/"
Voici le genre de trucs que ça peut donner à la fin (et encore, c'est bien crade, :D).
[^] # Re: avec une boucle for ?
Posté par Cyril Lavier . Évalué à 1.
Totalement en AWK, mais ça en devient totalement illisible, :).
[^] # Re: avec une boucle for ?
Posté par totof2000 . Évalué à 2.
echo "un deux trois quatre" |awk -F"[ \\t]+" ' {sub($1"("FS")","");print }'
L'avantage de cette règle est que tu peux avoir des champs séparés d'une ou plusieurs tablulation ou espaces ....
Amusant ce petit problème. Ca détend :)
# Après, on peut toujours s'amuser avec d'autres outils
Posté par Cyril Lavier . Évalué à 2.
echo "un deux trois quatre" | sed 's/^.[^* ] //'
Ça vire le premier champ, peut importe ce qu'il contient.
Après, je suis persuadé que c'est facilement faisable dans d'autres langages, mais qui risquent de rendre le script de moins en moins maintenable, :D.
[^] # Re: Après, on peut toujours s'amuser avec d'autres outils
Posté par Nopenope . Évalué à 1.
echo "un deux trois quatre"| perl -pe 's/^.[^* ] //;'
[^] # Re: Après, on peut toujours s'amuser avec d'autres outils
Posté par xylo (site web personnel) . Évalué à 1.
je ne veux pas récupérer le premier séparateur de champ (l'espace entre 'un' et 'deux' ) !!!
Bon de toute façon je n'allais pas mettre un morceau de perl dans mon bash sinon il fallait tout faire en perl .... ;-)
cut me va très bien et en plus (pour une fois) c'est élégant...
# avec un shift
Posté par eric gerbier (site web personnel) . Évalué à 8.
#!/bin/sh
shift
echo "$*"
$ ./essai.sh un deux trois qautre
deux trois qautre
[^] # Re: avec un shift
Posté par Dabowl_75 . Évalué à 2.
C'est tout con mais il fallait y penser, sachant que l'IFS répond déjà à la problématique initiale.
# a moi
Posté par fearan . Évalué à 5.
echo "a b c d"| ( read a b ; echo $b)
b c d
ou
a="a b c d"
echo ${a#* }
b c d
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
# Une solution courte
Posté par Frederic Brugmans . Évalué à 1.
cat undeuxtrois| awk -F: ' { gsub($1FS$2,$2) ; print $0 }'
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.