/ / ako extrahovať grep a nakrájame na bash pole - linux, bash, shell, sh

ako extrahovať grep a nakrájame na bash pole - linux, bash, shell, sh

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ď č. 1

tvoj 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