При выполнении сценария оболочки входная строка подобна этому:
test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class
Как может я извлекать: test1/test2/Test.jar
[т.е. подстрока до первого вхождения '.jar' разделитель, включительно], в сценарии оболочки
Как я могу сделать это? Я не хотел бы использовать сокращение и затем добавлять '.jar' в конце.
Спасибо
Вы могли использовать 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
Кроме того, 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.)Так как Вы упоминаете сценарии оболочки, я представляю простое, чисто основанное на оболочке решение:
s='test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class'
echo "${s%%.jar*}.jar"
Расширение параметра %%
удаляет самый длинный суффикс, который соответствует последующему шаблону шарика .jar*
(в противоположность %
который соответствует самому короткому суффиксу).
В 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
Так как этот вопрос отмечен 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
оператор