Подтвердить что ты не робот

Извлечение части строки в переменную в bash

noob здесь, извините, если repost. Я извлекаю строку из файла и заканчиваю строкой, что-то вроде:

abcdefg:12345:67890:abcde:12345:abcde

Скажем, это в переменной с именем testString длина значений между двоеточиями не является постоянной, но я хочу сохранить число, как строку в порядке, переменной, между 2-м и 3-м двоеточиями. так что в этом случае я бы закончил свою новую переменную, позвольте ей ее извлечьNum, будучи 67890. Я предполагаю, что я должен использовать sed, но никогда не использовал его и пытаюсь обойти его... Может ли кто-нибудь помочь? Приветствия

На боковой ноте я использую find для извлечения всей строки из строки, путем поиска первой строки символов, в данном случае части abcdefg.

4b9b3361

Ответ 1

Вот еще один чистый способ bash. Прекрасно работает, когда ваш ввод достаточно согласован, и вам не нужна большая гибкость в том, какой раздел вы выбираете.

extractedNum="${testString#*:}"     # Remove through first :
extractedNum="${extractedNum#*:}"   # Remove through second :
extractedNum="${extractedNum%%:*}"  # Remove from next : to end of string

Вы также можете фильтровать файл во время его чтения, например, в цикле while:

while IFS=' ' read -r col line ; do
    # col has the column you wanted, line has the whole line
    # # #
done < <(sed -e 's/\([^:]*:\)\{2\}\([^:]*\).*/\2 &/' "yourfile")

Команда sed выбирает второй столбец и ограничивает это значение из всей строки пробелом. Если вам не нужна вся строка, просто удалите пробел + & от замены и отбросить переменную строки из чтения. Вы можете выбрать любой столбец, изменив число в бите \{2 \}. (Поместите команду в двойные кавычки, если вы хотите использовать переменную там.)

Ответ 2

Pure Bash с использованием массива:

testString="abcdefg:12345:67890:abcde:12345:abcde"
IFS=':'
array=( $testString )
echo "value = ${array[2]}"

Выход:

value = 67890

Ответ 3

Вы можете использовать cut для такого рода вещей. Вот вы:

VAR=$(echo abcdefg:12345:67890:abcde:12345:abcde |cut -d":" -f3); echo $VAR

Для удовольствия от этого, я бы это сделал (не) с помощью sed, но я уверен, что есть более простые способы. Думаю, это был бы вопрос моего будущего для будущих читателей;)

echo abcdefg:12345:67890:abcde:12345:abcde |sed -e "s/[^:]*:[^:]*:\([^:]*\):.*/\1/"

Ответ 4

это должно работать на вас: ключевая часть awk -F: '$0=$3'

NewVar=$(getTheLineSomehow...|awk -F: '$0=$3')

Пример:

kent$  newVar=$(echo "abcdefg:12345:67890:abcde:12345:abcde"|awk -F: '$0=$3')

kent$  echo $newVar 
67890

если ваш текст был сохранен в var testString, вы могли бы:

kent$  echo $testString                                                                                                                                                     
abcdefg:12345:67890:abcde:12345:abcde
kent$  newVar=$(awk -F: '$0=$3' <<<"$testString")
kent$  echo $newVar                                                                                                                                                         
67890