Comment utiliser Sed pour remplacer tous les caractères avant les deux points?

25

Comment remplacer la chaîne suivante

hd_ma_prod_customer_ro:*:123456789:john.doe

avec john.doe

Fondamentalement, je dois rechercher le dernier signe deux-points (:) et tout supprimer avant de l'inclure.

yihyoon
la source

Réponses:

40

En supposant que ce que vous voulez réellement dire, c'est que vous voulez tout supprimer jusqu'au dernier colon et laisser john.doeintact:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Explication:

La première ligne dirige simplement la chaîne de test à seddes fins d'exemple.

Le second est une sedsubstitution de base . La partie entre le premier et le second /est l'expression rationnelle à rechercher et la partie entre le deuxième et le troisième est ce par quoi le remplacer (rien dans ce cas car nous supprimons).

Pour l'expression régulière, .correspond à n'importe quel caractère, le *répète autant de fois (y compris zéro) et :correspond à deux points. Si efficacement, c'est tout ce qui est suivi d'un côlon. Puisque .*peut inclure un deux-points, la correspondance est «gourmande» et tout jusqu'au dernier deux-points est inclus.

Graeme
la source
7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Je remplace toutes les occurrences de : par un onglet puis j'utilise awkpour extraire la chaîne john.doe.

Si vous n'avez pas de fichier, vous pouvez essayer ceci.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Selon les commentaires de Graeme, nous pouvons utiliser awkpour imprimer la dernière colonne seule en utilisant la NFvariable de awkcomme ci-dessous.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Incorporer les commentaires de Graeme pour se débarrasser des inutiles sed

La commande peut être modifiée comme ci-dessous.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
Ramesh
la source
1
Si vous allez utiliser awk, pourquoi ne pas simplement le faire awk -F:?
Graeme
@Graeme, je ne suis toujours pas à l'aise avec awk. Fondamentalement, j'essaie de tester les commandes que j'ai initialement reçues dans ma réponse et d'essayer de les modifier en fonction des besoins de l'utilisateur. :)
Ramesh
3
L' -Foption pour awkspécifie le séparateur de champ. Si vous dites awkd'utiliser un deux-points, il n'est pas nécessaire de remplacer les deux-points par des tabulations. De plus, si vous souhaitez obtenir le dernier champ que vous pouvez utiliser à la $NFplace $4, cela fonctionnera alors s'il n'y a pas toujours 3 deux-points.
Graeme
@Graeme, j'ai intégré les changements que vous avez mentionnés. S'il vous plaît laissez-moi savoir si cela va bien :)
Ramesh
Oui, fonctionne parfaitement!
Graeme
6

Une autre méthode utilisant awk:

awk -F: '{ print $NF }'
Chris Down
la source
2

S'il vous plaît essayez

modifier: ancre supprimée

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

et supprimer

echo 'abc:fjk' |sed 's/.*://g'
akash
la source
ce n'est pas ce que le PO demande
iruvar
veuillez relire la question.
akash
Eh bien, vous avez glissé dans la suppression après mon commentaire, tant
pis
Oh je vois . mes excuses 1_CR
akash
1
L' ^ancre ne fait aucune différence dans le cas de la question ou dans votre cas d'exemple. Toute adresse commençant par commence /.*déjà par le ^.
mikeserv