Разделите строку в shell, чтобы получить все поля до final ‘.’ (Bash)

#string #bash

#строка #bash

Вопрос:

Я хочу получить 1.2.3.4 из строки 1.2.3.4.5 Я знаю, что могу использовать этот код для получения окончательного числа, но что я могу использовать, чтобы получить все предыдущие числа. (Включая ‘:’)

 $ foo=1.2.3.4.5
$ c_num=`echo ${foo##*.}`
$ echo $c_num
$ 5
  

Я пробовал использовать IFS.

 $ IFS='.' read -ra STRING <<< "$foo"
$ u_num="${STRING[0]}"'.'"${STRING[1]}"'.'"${STRING[2]}"'.'"${STRING[3]}"
$ echo $u_num
$ 1 2 3 4
# It should have returned 1.2.3.4
  

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

1. Да, это используется в чистом сценарии оболочки bash.

2. В чем именно смысл второго примера? Если foo 1.2.3.4.5 да, то как вы хотите 1.2.6 получить результат?

3. Как вы можете видеть, 1 2 3 4 все собираются в массив, но моей переменной u_num нужны только первые 2. Я отредактирую код, чтобы сделать все четыре.

4. Почему вы используете : ?

5. извините, это была ошибка, обновлено.

Ответ №1:

Попробуйте использовать:

 echo ${foo%.*}
  

Получение:

 foo="1.2.3.4.5"
echo ${foo%.*}
1.2.3.4
  

и

 foo="1 2 6"
echo ${foo%.*}
  

выдает

 1 2 6
  

Если вы хотите преобразовать пробелы в . , вы можете использовать tr :

 echo $foo | tr ' ' '.'
  

Что дает следующее для foo="1 2 6"

 1.2.6
  

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

1. это также возвращает ‘1 2 3’

2. @RussellHickey у меня это работает с bash под Debian. Вы уверены, что используете bash? в чем ваша фишка?

3. @RussellHickey Я не уверен, что понимаю ваш комментарий. Что именно дает 1 2 3 результат? Возможно, ваш второй пример в постановке задачи нуждается в уточнении.

4. @RussellHickey не могли бы вы тогда просто использовать tr ? Например, ? echo $foo | tr ' ' '.'

5. @RussellHickey tr — это внешняя команда для Bash, а не встроенная. Обычно, когда мы упоминаем только Bash (или чистый Bash), мы игнорируем все внешние команды и хотим только встроенные. Введите help , чтобы получить список всех встроенных функций и ключевых слов; вы увидите, что tr этого нет в списке.