Řekněme, že máte dlouhý řetězec s několika slovy oddělenými čárkou nebo podtržítkem. Chcete tento řetězec rozdělit a extrahovat jednotlivá slova.
Řetězce můžete v bash rozdělit pomocí příkazu Internal Field Separator (IFS) a read nebo můžete použít příkaz tr. Dovolte mi, abych vám na příkladech ukázal, jak to udělat.
Metoda 1:Rozdělení řetězce pomocí příkazu read v Bash
Zde je můj ukázkový skript pro rozdělení řetězce pomocí příkazu read:
#!/bin/bash
#
# Script to split a string based on the delimiter
my_string="Ubuntu;Linux Mint;Debian;Arch;Fedora"
IFS=';' read -ra my_array <<< "$my_string"
#Print the split string
for i in "${my_array[@]}"
do
echo $i
done
Část, která rozděluje řetězec, je zde:
IFS=';' read -ra my_array <<< "$my_string"
Dovolte mi, abych vám to vysvětlil. IFS určuje oddělovač, na kterém chcete rozdělit řetězec. V mém případě je to středník. Může to být cokoli, co chcete, například mezera, tabulátor, čárka nebo dokonce písmeno.
IFS v příkazu read rozdělí vstup na oddělovač. Příkaz read čte nezpracovaný vstup (volba -r), takže zpětná lomítka doslova interpretuje, místo aby je považoval za znak escape. Volba -a s příkazem read ukládá přečtené slovo do pole v bash.
Jednodušeji řečeno, dlouhý řetězec je rozdělen na několik slov oddělených oddělovačem a tato slova jsou uložena v poli.
Nyní můžete přistupovat k poli a získat libovolné slovo, které chcete, nebo použít smyčku for v bash k vytištění všech slov jedno po druhém, jak jsem to udělal ve výše uvedeném skriptu.
Zde je výstup výše uvedeného skriptu:
Ubuntu
Linux Mint
Debian
Arch
Fedora
Metoda 2:Rozdělení řetězce pomocí příkazu tr v Bash
Toto je příklad rozdělení řetězce bash pomocí příkazu tr (translate):
#!/bin/bash
#
# Script to split a string based on the delimiter
my_string="Ubuntu;Linux Mint;Debian;Arch;Fedora"
my_array=($(echo $my_string | tr ";" "\n"))
#Print the split string
for i in "${my_array[@]}"
do
echo $i
done
Tento příklad je v podstatě stejný jako ten předchozí. Místo příkazu read se k rozdělení řetězce na oddělovači používá příkaz tr.
Problém s tímto přístupem je, že prvek pole je rozdělen na „oddělovač mezery“. Z tohoto důvodu budou prvky jako „Linux Mint“ považovány za dvě slova.
Zde je výstup výše uvedeného skriptu:
Ubuntu
Linux
Mint
Debian
Arch
Fedora
To je důvod, proč dávám přednost prvnímu způsobu rozdělení řetězce v bash.
Doufám, že vám tento rychlý bash návod pomohl při rozdělování struny. V souvisejícím příspěvku si také můžete přečíst o porovnávání řetězců v bash.
A pokud jste v Bash úplně noví, přečtěte si naši sérii výukových programů pro začátečníky.