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.

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.


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}'

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


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'

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.