web-dev-qa-db-fra.com

Comment couper une chaîne après un caractère spécifique sous unix

J'ai donc cette chaîne:

[email protected]:/home/some/directory/file

Je veux juste extraire l'adresse du répertoire, ce qui veut dire que je veux seulement le bit après le caractère ":" et obtenir:

/home/some/directory/file

merci.

J'ai besoin d'une commande générique pour que la commande cut ne fonctionne pas car la variable $ var n'a pas de longueur fixe.

25
canecse

Utilisation de sed:

$ [email protected]:/home/some/directory/file
$ echo $var | sed 's/.*://'
/home/some/directory/file
35
falsetru

Cela pourrait fonctionner pour vous:

echo ${var#*:}

Voir Exemple 10-10. Correspondance de modèle dans la substitution de paramètre

25
potong

Pour être complet, utiliser cut

cut -d : -f 2 <<< $var

Et en n'utilisant que bash:

IFS=: read a b <<< $var ; echo $b
10
chthonicdaemon

Cela fera aussi.

echo $var | cut -f2 -d":"
10
Manish V

Cela devrait faire l'affaire:

$ echo "$var" | awk -F':' '{print $NF}'
/home/some/directory/file
7
Chris Seymour

Vous ne dites pas quelle Shell vous utilisez. S'il s'agit d'un logiciel compatible POSIX tel que Bash, le développement de paramètres peut faire ce que vous voulez:

Paramètre Expansion

...

${parameter#Word}

Supprimer le plus petit motif de préfixe.
Le Word est développé pour produire un motif. Le paramètre de développement entraîne alors parameter, la plus petite partie du préfixe correspondant au motif supprimé.

En d'autres termes, vous pouvez écrire

$var="${var#*:}"

qui enlèvera tout ce qui correspond à *: de $var _ (c'est-à-dire tout ce qui va jusqu'au premier :). Si vous voulez correspondre au dernier :, alors vous pouvez utiliser ## au lieu de #.

Tout cela en supposant que la partie à supprimer ne contient pas : (vrai pour les adresses IPv4, mais pas pour les adresses IPv6)

4
Toby Speight
awk -F: '{print $2}' <<< $var
2
Jotne