Извлечение части строки в переменную в 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