Извлечь первый процент из строки

Используйте комбинацию mkdir и dirname перед выполнением sftp

mkdir -p $(dirname /base/q/w/e/r/t/y/file)
  • dirnameизвлечет полный путь каталога к файлу

  • mkdir -pобеспечит создание всего дерева каталогов
    (даже если он частично доступен)

0
19.11.2020, 16:05
4 ответа
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 цифры.

2
18.03.2021, 22:48

Если эта строка находится в переменной оболочки, чтобы извлечь первую последовательность десятичных цифр, за которой следует %.

С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должен содержать допустимый текст для вашей локали.

2
18.03.2021, 22:48

Использованиеawk:

awk -F '[()]' '{print $2}' <<< "$string"

Выход:

99%

Примечание. :На самом деле будет выведено все, что находится внутри первого (...), независимо от того, что это такое.

3
18.03.2021, 22:48

Это поможет вам получить желаемый результат

Подход 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%

-1
18.03.2021, 22:48

Теги

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