web-dev-qa-db-fra.com

Besoin d'extraire une sous-chaîne d'une chaîne de chemin de fichier incluant le délimiteur

Lors de l’exécution d’un script Shell, une chaîne de saisie ressemble à ceci:

test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class

Comment puis-je extraire: test1/test2/Test.jar [i.e. sous-chaîne jusqu'à la première occurrence du délimiteur '.jar', inclus], en script Shell

Comment puis-je faire ceci? Je ne voudrais pas utiliser couper et ensuite ajouter ".jar" à la fin.

Merci

6
Soumali Chatterjee

Vous pouvez utiliser sed comme ci-dessous:

sed 's/\(\.jar\).*/\1/' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class" 

Ou par la commande awk:

awk -F'\\.jar' '{print $1".jar"}' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"

La sortie est:

test1/test2/Test.jar
6
αғsнιη

Outre sedname __ , vous avez également la possibilité d'utiliser grepNAME _ pour cela, avec la regex PCRE ^.*?\.jar:

grep -oP '^.*?\.jar' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"

Ceci affiche uniquement la correspondance (-o), utilise PCRE (-P) et correspond au texte qui:

  • commence au début de la ligne (^), et
  • contient n'importe quel caractère (.), n'importe quel nombre de fois mais correspond paresseusement (*?),
  • suivi d'un littéral . (\.) et de jar(jarname__)

En utilisant le quantificateur paresseux*? au lieu du quantificateur glouton habituel *, grepcorrespond au plus petit nombre de caractères possible.

  • Sans lui (et avec le quantificateur glouton à la place), grepcorrespondrait à autant de caractères que possible tant que la correspondance se terminait par .jar, qui ne pourrait pas s'arrêter après le premier .jar dans cas où il y en a plus d'un.
  • Le drapeau -P est requis car, parmi les dialectes regex grepname__, prend en charge Ubuntu, PCRE est celui qui prend en charge la paresse . ( This dialect est très similaire à le dialecte regex en Perl .)
7
Eliah Kagan

Puisque vous mentionnez les scripts Shell, je vous présente une solution simple, entièrement basée sur Shell:

s='test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class'
echo "${s%%.jar*}.jar"

Le expansion du paramètre%% supprime le suffixe le plus long qui correspond au suivant (motif global).jar* (par opposition à % qui correspond au suffixe le plus court).

6
David Foerster

Cette question étant étiquetée bashname__, voici un script bashavec une boucle de style C et le développement du paramètre ${variable:beginning:offset} pour extraire des caractères individuels.

#!/usr/bin/env bash

substring=""
for ((i=0;i<=${#1};i++))
do
    substring="$substring""${1:$i:1}"
    if [[ "$substring" == *.jar ]]
    then
        echo "$substring"
        substring=""
    fi
done

Cela fonctionne comme si en action:

$ ./parse_string.sh test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class                                                                              
test1/test2/Test.jar
/Test2.jar

Si nous voulions extraire uniquement la première occurrence, ajoutez breaken ligne après substring="" dans l'instruction ifname__

3
Sergiy Kolodyazhnyy

Dans python:

python3 -c "print('blub/blab/Test.jar/blieb'.split('.jar')[0]+'.jar')"

> blub/blab/Test.jar

ou:

python3 -c "s='blub/blab/Test.jar/blieb';print(s[:s.find('.jar')+4])"

> blub/blab/Test.jar
3
Jacob Vlijm