2012-02-29 3 views
0

Je voudrais extraire une chaîne comme ci-dessous:Comment extraire une chaîne dans csh?

setenv VARIABLE /opt/Application/File/Version22 

Je veux afficher uniquement

File/Version22 

à l'écran. Cela signifie que /opt/Application/ est toujours le préfixe. Je veux afficher le reste de la chaîne. Comment puis-je le faire dans csh?

Cordialement

+1

est le préfixe toujours "/ opt/Application"? Si oui, pourquoi ne pas utiliser 'sed':' echo $ VARIABLE | sed's #/opt/Application/## g'' –

Répondre

1

Maintenant que vous avez mis à jour la question (merci pour cela), il est clair que vous toujours vouloir supprimer le préfixe /opt/Application.

La façon la plus simple de le faire, qui travaillera en toute coquille, est:

echo $VARIABLE | sed 's|^/opt/Application/||' 

(Il est habituel d'utiliser / comme séparateur pour le remplacement comme celui-ci, mais vous pouvez utiliser un caractère de ponctuation; . J'utilise | pour éviter tout conflit avec les / caractères dans le motif)

Un plus tcsh spécifique, et peut-être plus efficace, façon de le faire est:

echo $VARIABLE:s|/opt/Application/|| 

Il est susceptible d'être plus efficace car il est fait dans le shell et évite d'invoquer la commande externe sed. D'un autre côté, la surcharge de l'exécution sed est peu susceptible d'être significative.

Notez bien que la syntaxe :s n'est pas prise en charge dans le fichier csh d'origine. Il est supporté dans tcsh et dans certaines versions plus récentes de csh. Si vous voulez faire cela de manière portable, utilisez simplement sed.

+0

Entièrement d'accord avec votre évaluation :-) Mais cela devrait probablement être un commentaire. –

+0

@ Christian.K: J'ai pensé à cela, mais la première partie répond à la question comme indiqué. –

+0

Assez juste :-) –

0

Je suppose que vous voulez obtenir les 2 noms de famille dans un nom de fichier:

setenv VARIABLE /opt/Application/File/Version22 
set lastfile=`basename $VARIABLE` 
set prevpath=`dirname $VARIABLE` 
set previousfile=`basename $prevpath` 
set file=$previousfile/$lastfile 
echo $file 
1

C-Shell a les modificateurs de chaîne intégrés qui peut le faire avec très peu de code:

echo $VARIABLE:h:t/$VARIABLE:t 

string modifiers: 
:h = remove the last directory (aka head) 
:t = remove every directory except the last one (aka tail) 
Questions connexes