Должен извлечь подстроку из строки пути к файлу включая разделитель

При выполнении сценария оболочки входная строка подобна этому:

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

Как может я извлекать: test1/test2/Test.jar [т.е. подстрока до первого вхождения '.jar' разделитель, включительно], в сценарии оболочки

Как я могу сделать это? Я не хотел бы использовать сокращение и затем добавлять '.jar' в конце.

Спасибо

6
задан 25 July 2017 в 21:53

5 ответов

Вы могли использовать sed как ниже:

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

Или через awk команда:

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

Вывод:

test1/test2/Test.jar
6
ответ дан 23 November 2019 в 07:15

Кроме того, sed, у Вас также есть опция использования grep для этого, с PCRE regex ^.*?\.jar:

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

Это печатает только соответствие (-o), использует PCRE (-P), и текст соответствий, что:

  • запускается в начале строки (^), и
  • содержит любой символ (.), любое количество раз, но подобранный лениво (*?),
  • сопровождаемый литералом . символ (\.) и jar (jar)

Используя ленивый квантор *? вместо обычного жадного квантора * причины grep соответствовать наименьшему количеству возможных символов.

  • Без него (и с жадным квантором вместо этого), grep соответствовал бы как можно большему количеству символов пока матч, законченный в .jar, которому не удалось бы остановиться после первого .jar в случаях, где существует больше чем один.
  • -P флаг требуется потому что regex диалектов grep поддержки на Ubuntu, PCRE является тем, который поддерживает лень. (Этот диалект очень похож на regex диалект в Perl.)
7
ответ дан 23 November 2019 в 07:15

Так как Вы упоминаете сценарии оболочки, я представляю простое, чисто основанное на оболочке решение:

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

Расширение параметра %% удаляет самый длинный суффикс, который соответствует последующему шаблону шарика .jar* (в противоположность % который соответствует самому короткому суффиксу).

6
ответ дан 23 November 2019 в 07:15

В python:

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

> blub/blab/Test.jar

или:

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

> blub/blab/Test.jar
3
ответ дан 23 November 2019 в 07:15

Так как этот вопрос отмечен bash, вот a bash сценарий с циклом C-стиля и ${variable:beginning:offset} расширение параметра для извлечения отдельных символов

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

Это работает как так в действии:

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

Если мы хотели извлечь только первое вхождение, добавить break на строке после substring="" внутри if оператор

3
ответ дан 23 November 2019 в 07:15

Другие вопросы по тегам:

Похожие вопросы: