2015-03-09 2 views
2

Я попытался:как извлечь Grep и нарезать Баш массив

здесь является содержание file.txt

some other text 
#1.something1=kjfk 
#2.something2=dfkjdk 
#3.something3=3232 
some other text 

Баш скрипт:

ids=(`grep "something" file.txt | cut -d'.' -f1`) 

for id in "${ids[@]}"; do 
    echo $id 
done 

результат:

(nothing newline...) 
(nothing newline...) 
(nothing newline...) 

, но все это печатает не что иное, как newl ine для каждого такого идентификатора найдено то, что мне не хватает?

+0

Он работает для меня, он печатает 3 строки: '# 1',' # 2' и '# 3'. – choroba

ответ

1

Ваш grep и cut должны работать, но вы можете использовать awk и уменьшить 2 команды в одну:

while read -r id; 
    echo "$id" 
done < <(awk -F '\\.' '/something/{print $1}' file.txt) 

Для заполнения массива:

ids=() 
while read -r id; 
    ids+=("$id") 
done < <(awk -F '\\.' '/something/{print $1}' file.txt) 
1

Вы можете использовать grep «s -o вариант для вывода только текста, соответствующего регулярному выражению:

$ ids=($(grep -Eo '^#[0-9]+' file.txt)) 
$ echo ${ids[@]} 
#1 #2 #3 

Это, конечно, не проверяет наличие периода на линии ... Если это важно, то вы можете либо расширить вещи с другой трубой:

$ ids=($(grep -Eo '^#[0-9]+\.something' file.txt | grep -o '^#[0-9]*')) 

или вы можете обрезать значение массива после заполнения массива:

$ ids=($(grep -Eo '^#[0-9]+\.something' file.txt)) 
$ echo ${ids[@]} 
#1.something #2.something #3.something 
$ for key in "${!ids[@]}"; do ids[key]="${ids[key]%.*}"; done 
$ echo ${ids[@]} 
#1 #2 #3 
Смежные вопросы