Как использовать заменить несколько цифр с одним символом - PullRequest
0 голосов
/ 14 января 2020

Код ниже превращает строку abcd-efj-klmnop-3.7.1.txt в abcd-efj-klmnop-*.*.*.txt, в то время как я хотел бы, чтобы она была abcd-efj-klmnop-*.txt (с одной звездочкой). Как этого добиться?

FILE_NAME="abcd-efj-klmnop-3.7.1.txt"
WILD_NAME=${FILE_NAME//[0-9]/*} 
echo $WILD_NAME

Ответы [ 4 ]

1 голос
/ 14 января 2020

Я бы предложил этот шаблон:

FILE_NAME="abcd-efj-klmnop-3.7.1.txt"
WILD_NAME=${FILE_NAME//[0-9]+(\.[0-9]+)*/*} 
echo $WILD_NAME

Дополнительная часть (\.[0-9]+)* ищет точку, за которой следуют одна или несколько цифр, любое количество раз.

0 голосов
/ 14 января 2020

У вас нет «нескольких цифр», как вы заявили в своем посте, но есть строка, состоящая из цифр и точек. Следовательно, я бы сделал

WILD_NAME=${FILE_NAME//[.0-9]/*.}

Выражение подстановки сначала должно было бы съесть точку перед расширением txt, поэтому я должен восстановить его.

0 голосов
/ 14 января 2020

Может быть недостаточно надежным, но если шаблон такой же, можно сделать решение PE.

  var2='*.'
  var=abcd-efj-klmnop-3.7.1.txt; 
  echo  "${var%-*}"$var2"${var##*.}"

Должно напечатать.

   abcd-efj-klmnop*.txt

"$ { var% - } " удаляет последнюю точку. в конце удаляет расширение .txt . "$ {var ## .}" удаляет самое длинное совпадение в начале, оставляя только расширение txt.

Приведенное выше решение также убрало трейлинг - да sh, который необходим. либо просто добавьте da sh перед "$ var", либо добавьте его в задание, либо это

  var2='*.'
  var=abcd-efj-klmnop-3.7.1.txt; 
  echo  "${var%%-[0-9]*}$var2${var##*.}"
0 голосов
/ 14 января 2020

Пожалуйста, попробуйте:

WILD_NAME=$(sed 's/[0-9]\{1,\}\(\.[0-9]\{1,\}\)*/*/' <<< "$FILE_NAME")

Если ваш bash поддерживает shopt встроенный, вы также можете сказать:

shopt -s extglob
WILD_NAME=${FILE_NAME/+([0-9])*(\.+([0-9]))/*}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...