Использование вывода выражения в нарезке строки bash

Чтобы установить Docker CE, вам необходимо настроить определение репозитория в соответствии с архитектурой вашей системы:

deb [arch=arm64] https://download.docker.com/linux/debian stretch stable

Microsoft не предоставляет пакеты.NET Core для вашей архитектуры, только для amd64; вам нужно будет загрузить бинарные архивы и следовать инструкциям по их установке вручную.

2
07.08.2020, 19:33
5 ответов

Использование другого подхода к проблеме и предоставление решения в одну -строку с использованием только bashфункциональности:

$ cat demo.sh
#!/bin/bash

INPUT_PATH=/path/to/subfolder/file_17.txt

FILE_NUMBER=${INPUT_PATH:((${#INPUT_PATH} -6)):2}
echo ${FILE_NUMBER}
$

$./demo.sh
17

Более простой подход состоял бы в обратном отсчете от конца строки, т.е.

FILE_NUMBER=${INPUT_PATH: -6:2}

Очевидно, это решение зависит от строковой переменной, оканчивающейся на «##XXXX», где «##» — две интересующие цифры, а «XXXX» — последние 4 символа строки.

3
18.03.2021, 23:14

Проще всего использовать ФАЙЛ _НОМЕР вместо TMP:

FILE_NUMBER=$(basename ${INPUT_PATH})
FILE_NUMBER=${FILE_NUMBER:5:2}

Кроме того, использование расширения параметра быстрее, чем вызов базового имени:

FILE_NUMBER=${INPUT_PATH##*/}
FILE_NUMBER=${FILE_NUMBER:5:2}

Вы можете использовать sed, чтобы делать все в одной строке, но это медленнее и менее читаемо:

FILE_NUMBER=$(sed 's|.*/||;s/.....\(..\).*/\1/' <<<"$INPUT_PATH")
2
18.03.2021, 23:14

Синтаксис ${var:offset:length}— это расширение параметра. Результат подстановки команды не является параметром (или переменной ).

«Хитрость» заключается в том, чтобы присвоить результат подстановки команды переменной.

Или выполните всю работу в подстановке команд:

num=$( echo "$INPUT_PATH" | rev | cut -d. -f2 | cut -d_ -f1 | rev )

Откажитесь от использования имен переменных ALLCAPS, оставьте их зарезервированными оболочкой. Однажды вы напишете PATH=something, а затем удивитесь, почему ваш сценарий не работает .

0
18.03.2021, 23:14

Поскольку вы используете bash, вы можете использовать сопоставление регулярных выражений:

if [[ $input =~ ([[:digit:]]+)\.txt$ ]]; then
    file_num=${BASH_REMATCH[1]}
fi
3
18.03.2021, 23:14

Для тех, кто использует zshвместоbash:

  • Символы с 6-го по 7-й в конце хвостовой(части, возвращаемойbasename)пути:

    num=${${a_path:t}[6,7]}
    

    ($var:tиз csh, чтобы получить tаил)

    Вы также можете выполнить num=${"$(basename -- "$a_path")":5:2}, используя этот оператор ksh93${var:offset:length}, недавно добавленный в zshдля совместимости. Подстановка команды должна быть заключена в кавычки, чтобы она не давала массив, так что :5:2выбирает диапазон символов вместо диапазона элементов массива. Однако использование подстановки команд и выполнение basenameокажется менее эффективным и менее надежным, чем использование zshвстроенного оператора :t.

  • первая последовательность цифр в хвосте :

    num=${(MS)${a_path:t}##<->}
    

    ${var##pattern}— это оператор ksh, который удаляет самую длинную начальную строку, соответствующую patternиз $var. С флагом Mвместо удаления возвращается присоединенная часть M, а Sищет Sподстроки, а не только в начале.И <->соответствует любой последовательности цифр(<x-y>с неопределенными границами ).

  • последовательность цифр после _в конце :

    num=${${a_path:t}/(#m)*_(<->)*/$match[1]}
    

    (потребности extendedglob; будьте осторожны, он возвращает полный хвост, если в$a_path)нет _digits.

    Или:

    [[ $a_path:t =~ '_([[:digit:]]+)' ]] && num=$match[1]
    
0
18.03.2021, 23:14

Теги

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