2013-04-09 3 views
11

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

abcdefg:12345:67890:abcde:12345:abcde 

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

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

+0

Возможный дубликат [Как обрезать пробел из переменной bash?] (Http://stackoverflow.com/questions/369758/how-to- trim-whitespace-from-bash-variable) – user2284570

ответ

9

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

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

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

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") 

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

+0

Старый пост, но поскольку ответ yr был принят, вы могли бы завершить его с таким коротким объяснением синтаксиса «done <<(sed ...)»? (часть седана ясна, мне интересно, как два справа налево перенаправляются, как <. Tx. – Cbhihe

5

Вы можете использовать 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/" 
+0

Спасибо за ответ молнии, я отдам его! –

+0

И еще одно замечание: как я тогда воспользуюсь этим, чтобы вернуть это число в новую строку, заменив то, что находится между вторым и третьим двоеточиями? –

+0

Я полагаю, что 'awt' лучше подходит, чем больше дополняет его.С sed вы можете сделать 'echo abcdefg: 12345: 67890: abcde: 12345: abcde | sed -e "s/\ ([^:] *: [^:] *: \) [^:] * \ (:. * \)/\ 1WHATEVER \ 2 /" ' – Miquel

2

это должно работать для вас: ключ часть 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 
13

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

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

Выход:

value = 67890 
+0

Очень элегантный (+1), но (к сожалению) действителен только для массива, поддерживающего оболочки Linux, такие как bash! – Cbhihe

+2

довольно уверен, что то, о чем попросил ОП ... bash –

Смежные вопросы