Извлечение части строки в переменную в bash
noob здесь, извините, если repost. Я извлекаю строку из файла и заканчиваю строкой, что-то вроде:
abcdefg:12345:67890:abcde:12345:abcde
Скажем, это в переменной с именем testString
длина значений между двоеточиями не является постоянной, но я хочу сохранить число, как строку в порядке, переменной, между 2-м и 3-м двоеточиями. так что в этом случае я бы закончил свою новую переменную, позвольте ей ее извлечьNum, будучи 67890. Я предполагаю, что я должен использовать sed, но никогда не использовал его и пытаюсь обойти его...
Может ли кто-нибудь помочь? Приветствия
На боковой ноте я использую find для извлечения всей строки из строки, путем поиска первой строки символов, в данном случае части abcdefg.
Ответы
Ответ 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