Добавление символа после цифры и точки в bash

#bash #shell #awk #sed

#bash #оболочка #awk #sed

Вопрос:

Я хочу изменить свою переменную a, добавив между любой цифрой и точкой непосредственно перед ней, пока мне удалось добавить только после первой цифры и первой точки.

Мой скрипт:

 branch="3.2.5"
firstbranch=$(echo $branch | sed -r 's/([0-9] .)(.)/1\2/g') amp;amp; echo $firstbranch
  

вывод, который он генерирует:

 3.2.5
  

и желаемый результат:

 3.2.5
  

Комментарии:

1. Косая черта вперед или назад?

2. попробуйте sed -E 's/([0-9])./1.\/g' <<< "$branch"

3. Вы написали добавление между любой цифрой и точкой , но в желаемом выводе вы поставили между любой точкой и цифрой, т. Е. в другом порядке.

4. исправлено, извините за путаницу

Ответ №1:

Вы можете использовать:

 sed 's/[0-9]./amp;\/g' <<< "$branch"
  
 3.2.5
  

Ответ №2:

В случае, если вы согласны awk , не могли бы вы попробовать следующие, написанные и протестированные с показанными примерами в ссылке https://ideone.com/T1suTg

 echo "$branch" | awk 'BEGIN{FS=".";OFS=".\"} {$1=$1} 1'
  

Объяснение: печать branch значения переменной оболочки echo и отправка его вывода в качестве стандартного ввода в awk команду. В awk программе в BEGIN блоке настройка разделителя полей as . и настройка разделителя выходных полей as, .\ который на самом деле . затем в основной программе переустанавливает 1-е поле на себя, чтобы применить новое значение разделителя выходных полей get. 1 выведет значение текущей строки.

Ответ №3:

Кроме того, можно использовать выражение POSIX BRE с sed для вставки между точкой и цифрой:

 branch="3.2.5"
firstbranch=$(echo $branch | sed 's/(.)([[:digit:]])/1\2/g') amp;amp; echo $firstbranch
  

Результат: 3.2.5

Смотрите Онлайн-доказательство.

Объяснение регулярных выражений

 --------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    .                       '.'
--------------------------------------------------------------------------------
  )                        end of 1
--------------------------------------------------------------------------------
  (                        group and capture to 2:
--------------------------------------------------------------------------------
    [[:digit:]]              any character of: digits (like d)
--------------------------------------------------------------------------------
  )                        end of 2
  

Ответ №4:

Переменное расширение

 branch="3.2.5"
echo ${branch//./.\}
3.2.5
  

Комментарии:

1. простое и короткое решение среди всех предложенных