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

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

abcdefg:12345:67890:abcde:12345:abcde

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

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

4 ответов


вот еще один чистый способ 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\}\([^:]*\).*/ &/' "yourfile")

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


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

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

вывод:

value = 67890

можно использовать 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/[^:]*:[^:]*:\([^:]*\):.*//"

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

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

пример:

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

kent$  echo $newVar 
67890

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

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