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
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
Outre sed
name __ , vous avez également la possibilité d'utiliser grep
NAME _ 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:
^
), et.
), n'importe quel nombre de fois mais correspond paresseusement (*?
),.
(\.
) et de jar
(jar
name__)En utilisant le quantificateur paresseux*?
au lieu du quantificateur glouton habituel *
, grep
correspond au plus petit nombre de caractères possible.
grep
correspondrait à 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.-P
est requis car, parmi les dialectes regex grep
name__, prend en charge Ubuntu, PCRE est celui qui prend en charge la paresse . ( This dialect est très similaire à le dialecte regex en Perl .)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).
Cette question étant étiquetée bash
name__, voici un script bash
avec 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 break
en ligne après substring=""
dans l'instruction if
name__
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