Используйте комбинацию mkdir и dirname перед выполнением sftp
mkdir -p $(dirname /base/q/w/e/r/t/y/file)
dirname
извлечет полный путь каталога к файлу
mkdir -p
обеспечит создание всего дерева каталогов
(даже если он частично доступен)
string='Identities = 99/100 (99%) total 0/0 (0%)'
grep -oP '^.*?\(\K([0-9][0-9]?(\.[0-9]+)?|100)%(?=\))' <<<"$string"
обратите внимание, что это возвращает первый допустимый процент, найденный в пределах (...)
, в случае, если первый найденный шаблон недействителен, если будет возвращена следующая надежда.
Это извлекает все возможные проценты в строке, совпадающей с тем же шаблоном, что и выше:
grep -Po '(?<=\()([1-9][0-9]?(\.[0-9]+)?|100)%(?=\))' <<<"$string"
измените [1-9]
на [0-9]
, если вы также хотите сопоставить 0%
с начальным нулем, например00%
~09%
.
[0-9]
соответствует только одной цифре почти во всех локациях. [0-9]?
соответствует одному -или -нулю одного и того же; замените это на [0123456789]
, если вы хотите сопоставлять только английские/ASCII цифры.
Если эта строка находится в переменной оболочки, чтобы извлечь первую последовательность десятичных цифр, за которой следует %
.
Сzsh
:
$ string='Identities = 99/100 (99%) total 0/0 (0%)'
$ print ${(MS)string#<->%}
99%
(или <1->%
, если вы хотите извлечь первый не -нулевой процент)
Сbash
:
$ string='Identities = 99/100 (99%) total 0/0 (0%)'
$ [[ $string =~ [0123456789]+% ]] && echo "$BASH_REMATCH"
99%
(или 0*[123456789][0123456789]*%
для первого не -нулевого процента ).
POSIXly:
awk -- '
BEGIN{
if (match(ARGV[1], /[0123456789]+%/))
print substr(ARGV[1], RSTART, RLENGTH)
}' "$string"
(Снова 0*[123456789][0123456789]*%
для первого не-нулевого процента ).
Для bash
и POSIX $string
должен содержать допустимый текст для вашей локали.
Использованиеawk
:
awk -F '[()]' '{print $2}' <<< "$string"
Выход:
99%
Примечание. :На самом деле будет выведено все, что находится внутри первого (...)
, независимо от того, что это такое.
Это поможет вам получить желаемый результат
Подход 1:
var='Identities = 99/100 (99%) total 0/0 (0%)'
echo ${var#*(} | sed -E 's/%*$/ /g' | sed 's/).*//'
Выход:
99%
Подход 2:
echo "Identities = 99/100 (99%) total 0/0 (0%) #*)" | sed -E 's/%*$/ /g' | sed 's/).*//' | cut -d'(' -f2
Выход:
99%