Precisa extrair uma substring de uma cadeia de caminho de arquivo incluindo o delimitador

6

Durante a execução de um script de shell, uma string de entrada é semelhante a esta:

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

Como posso extrair: test1/test2/Test.jar [i.e. substring até a primeira ocorrência de '.jar' delimiter, inclusive], no shell script

Como posso fazer isso? Eu não gostaria de usar o corte e, em seguida, acrescentar '.jar' no final.

Obrigado

    
por Soumali Chatterjee 26.07.2017 / 06:17

5 respostas

6

Você pode usar sed como abaixo:

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

Ou através do comando awk :

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

A saída é:

test1/test2/Test.jar
    
por αғsнιη 26.07.2017 / 06:50
8

Além de sed , você também tem a opção de usar grep para isso, com o regex ^.*?\.jar :

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

Imprime apenas a correspondência ( -o ), usa PCRE ( -P ) e corresponde ao texto que:

  • começa no início da linha ( ^ ) e
  • contém qualquer caractere ( . ), qualquer número de vezes, mas correspondido com lentidão ( *? ),
  • seguido por um caractere literal . ( \. ) e jar ( jar )

Usando o quantificador lento *? em vez do quantificador voraz habitual * faz com que grep corresponde ao menor número possível de caracteres.

  • Sem ele (e com o quantificador guloso em vez disso), grep corresponderia a tantos caracteres quanto possível, desde que a partida terminasse em .jar , o que falharia após o primeiro .jar nos casos em que há mais de um.
  • O sinal -P é necessário porque, dos regex dialect grep suporta no Ubuntu, PCRE é o que suporta a preguiça . ( Este dialeto é muito parecido com o dialeto regex em Perl .
por Eliah Kagan 26.07.2017 / 07:22
6

Como você mencionou o shell script, eu apresento uma solução simples e baseada em shell:

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

A expansão de parâmetros %% remove o sufixo mais longo que corresponde ao subsequente padrão de glob .jar* (em oposição a % que corresponde ao menor sufixo).

    
por David Foerster 26.07.2017 / 18:42
3

Em 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
    
por Jacob Vlijm 26.07.2017 / 08:47
3

Como esta questão está marcada com bash , aqui está um script bash com loop de estilo C e ${variable:beginning:offset} de expansão de parâmetro para extrair caracteres individuais

#!/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

Isso funciona assim em ação:

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

Se quisermos extrair apenas a primeira ocorrência, adicione break na linha após substring="" dentro de if declaração

    
por Sergiy Kolodyazhnyy 26.07.2017 / 08:42