При выполнении сценария оболочки строка ввода похожа на следующую:
test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class
Как я могу извлечь: test1/test2/Test.jar [т.е. подстрока до первого появления разделителя .jar, включительно], в сценарии оболочки
Как это сделать? Я бы не хотел использовать cut, а затем добавить «.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, как показано ниже:
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, как показано ниже:
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 ^.*?\.jar:
grep -oP '^.*?\.jar' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"
Это выводит только совпадение (-o), использует Кроме sed (-P) и соответствует тексту, который:
начинается с начала строки (^) и содержит любой символ (.), любое число раз, но лениво согласовано (*?), за которым следует буквальный символ . (\.) и jar (jar)Используя ленивый квантификатор [ f14] вместо обычного жадного квантификатора * вызывает grep, чтобы соответствовать наименьшему количеству символов.
начинается в начале строки (^) и Флаг -P требуется, потому что на диалектах regex grep поддерживается Ubuntu, PCRE - это тот, который поддерживает лень. (Этот диалект очень похож на диалект регулярного выражения в Perl.)Поскольку вы упоминаете сценарий оболочки, я представляю простое, чисто основанное на оболочке решение:
s='test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class'
echo "${s%%.jar*}.jar"
Расширение параметра %% удаляет самый длинный суффикс, который соответствует последующему шаблону glob .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, вот скрипт 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 оператора
Поскольку вы упоминаете сценарий оболочки, я представляю простое, чисто основанное на оболочке решение:
s='test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class'
echo "${s%%.jar*}.jar"
Расширение параметра %% удаляет самый длинный суффикс, который соответствует последующему шаблону glob .jar* (в противоположность на %, который соответствует кратчайшему суффиксу).
Кроме sed, вы также можете использовать grep для этого с помощью регулярного выражения PCRE ^.*?\.jar:
grep -oP '^.*?\.jar' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"
Это выводит только совпадение (-o), использует Кроме sed (-P) и соответствует тексту, который:
начинается с начала строки (^) и содержит любой символ (.), любое число раз, но лениво согласовано (*?), за которым следует буквальный символ . (\.) и jar (jar)Используя ленивый квантификатор *? вместо обычного жадного квантификатора * вызывает grep, чтобы соответствовать наименьшему количеству символов.
начинается в начале строки (^) и Флаг -P требуется, потому что на диалектах regex grep поддерживается Ubuntu, PCRE - это тот, который поддерживает лень. (Этот диалект очень похож на диалект регулярного выражения в Perl.)В 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, вот скрипт 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 оператора
Поскольку вы упоминаете сценарий оболочки, я представляю простое, чисто основанное на оболочке решение:
s='test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class'
echo "${s%%.jar*}.jar"
Расширение параметра %% удаляет самый длинный суффикс, который соответствует последующему шаблону glob .jar* (в противоположность на %, который соответствует кратчайшему суффиксу).
Кроме sed, вы также можете использовать grep для этого с помощью регулярного выражения PCRE ^.*?\.jar:
grep -oP '^.*?\.jar' <<<"test1/test2/Test.jar/Test2.jar/com/test/ui/GI.class"
Это выводит только совпадение (-o), использует Кроме sed (-P) и соответствует тексту, который:
начинается с начала строки (^) и содержит любой символ (.), любое число раз, но лениво согласовано (*?), за которым следует буквальный символ . (\.) и jar (jar)Используя ленивый квантификатор *? вместо обычного жадного квантификатора * вызывает grep, чтобы соответствовать наименьшему количеству символов.
начинается в начале строки (^) и Флаг -P требуется, потому что на диалектах regex grep поддерживается Ubuntu, PCRE - это тот, который поддерживает лень. (Этот диалект очень похож на диалект регулярного выражения в Perl.)В 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, вот скрипт 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 оператора