Skúsil som:
tu je obsah súboru.txt
some other text
#1.something1=kjfk
#2.something2=dfkjdk
#3.something3=3232
some other text
bash skript:
ids=( `grep "something" file.txt | cut -d"." -f1` )
for id in "${ids[@]}"; do
echo $id
done
výsledok:
(nothing newline...)
(nothing newline...)
(nothing newline...)
ale všetko, čo vytlačí, nie je nič ako nový riadok pre každú takúto id nájdené, čo mi chýba?
odpovede:
1 pre odpoveď č. 1tvoj grep
a cut
by mal fungovať, ale môžete použiť awk
a znížiť 2 príkazy do jedného:
while read -r id;
echo "$id"
done < <(awk -F "\." "/something/{print $1}" file.txt)
Ak chcete vyplniť pole:
ids=()
while read -r id;
ids+=( "$id" )
done < <(awk -F "\." "/something/{print $1}" file.txt)
1 pre odpoveď č. 2
Môžeš použiť grep
"s -o
možnosť výstupu iba textu, ktorý zodpovedá regulárnemu výrazu:
$ ids=($(grep -Eo "^#[0-9]+" file.txt))
$ echo ${ids[@]}
#1 #2 #3
To samozrejme nekontroluje existenciu obdobia na linke ... Ak je to dôležité, potom by ste mohli buď rozšíriť veci s iným potrubím:
$ ids=($(grep -Eo "^#[0-9]+.something" file.txt | grep -o "^#[0-9]*"))
alebo by ste mohli orezať hodnoty po ukladaní poľa:
$ 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