web-dev-qa-db-fra.com

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

Comment remplacer la chaîne suivante

hd_ma_prod_customer_ro:*:123456789:john.doe

avec john.doe

Fondamentalement, j'ai besoin de rechercher les derniers deux-points (:) et de tout supprimer avant de l'inclure.

31
yihyoon

En supposant que ce que vous voulez réellement dire, c'est que vous voulez tout supprimer jusqu'au dernier signe deux-points et laisser le john.doe intact:

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

Explication:

La première ligne redirige simplement la chaîne de test vers sed à titre d'exemple.

La seconde est une substitution de base sed . La partie entre le premier et le deuxième / est l'expression rationnelle à rechercher et la partie entre la deuxième et la troisième est celle par laquelle la remplacer (rien dans ce cas car nous supprimons).

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

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

Je remplace toutes les occurrences de : par un onglet puis j'utilise awk pour 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 awk pour imprimer la dernière colonne seule en utilisant la variable NF de awk comme ci-dessous.

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

Incorporation des commentaires de Graeme pour se débarrasser des sed inutiles

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

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
7
Ramesh

Une autre méthode utilisant awk:

awk -F: '{ print $NF }'
6
Chris Down

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'
2
akash