2016-04-29 2 views

ответ

1

проверить это:

kent$ echo "abc-ananya-07"|awk -F'-' -v OFS='-' '{$3=sprintf("%02d",++$3)}7' 
abc-ananya-08 

Вышеуказанные коды делают приращение и сохранить ваш формат номера.

+0

работает хорошо. Спасибо. :) –

1

С чистым Bash это немного долго:

IFS="-" read -r -a arr <<< "abc-ananya-01" 
last=10#${arr[${#arr}-1]} # to prevent getting 08, when Bash 
          # understands it is a number in base 8 
last=$((last + 1)) 
arr[${#arr}-1]=$(printf "%02d" $last) 
(IFS="-"; echo "${arr[*]}") 

Это читает в массив, увеличивает последний элемент и выводит его обратно.

возвращает:

abc-ananya-02 
+1

'bash' 4.3 теперь разрешает отрицательные индексы, поэтому вы можете написать' last = $ (($ {arr [-1]} + 1)) '(он достаточно короткий, чтобы сделать однострочный разумный). – chepner

+1

На самом деле вы можете использовать 'printf -v arr [-1]"% 02d "$ ((arr [-1] +1))', чтобы избежать необходимости во временной переменной 'last'. – chepner

+0

Это решение не работает с этими входами: a = 'abc-ananya-08' или a = 'abc-ananya-09' bash error: bash: let: last = 08: слишком большое значение для базы (токен ошибки «08»). Мой правильный ответ здесь: [http://stackoverflow.com/a/36934535/4581311] –

3

Он короче:

a=abc-lhg-08 
echo ${a%-*}-`printf "%02d" $((10#${a##*-}+1))` 
abc-lhg-09 

Еще лучше:

a=abc-lhg-08 
printf "%s-%02d\n" ${a%-*} $((10#${a##*-}+1)) 
abc-lhg-09 
+1

Ничто в этом ответе не требует 'bash' 4 или даже каких-либо расширений' bash'; он будет работать в любой оболочке POSIX. – chepner

+0

В моем первом примере я нашел фундаментальную проблему, и я ее исправил. Исходный первый пример не может работать с входами abc-lhg-08 или abc-lhg-09. Я должен был подавить авто-восьмеричную интерпретацию bash, когда был начальный ноль, с явным указателем на radix ten 10 #. Я показываю вам, что я имею в виду: 'a = 08; echo $ (($ a)) bash: 08: слишком большое значение для базы (токен ошибки равен« 08 ») a = 08; echo $ ((10 # $ a)) 8' И нет причин использовать оба эха и printf, поэтому второй пример больше подходит. –

1

Bash струнные манипуляции могут быть использованы здесь.

a='abc-ananya-07' 
let last=$(echo ${a##*-}+1) 
echo ${a%-*}-$(printf "%02d" $last) 

enter image description here

+0

Это решение не работает с этими входами: a = 'abc-ananya-08' или a = 'abc-ananya-09' bash error: bash: let: last = 08: слишком большое значение для базы (токен ошибки «08») Мой правильный ответ здесь: [http://stackoverflow.com/a/36934535/4581311] –

 Смежные вопросы

  • Нет связанных вопросов^_^