V tomto tématu jsme definovali, jak rozdělit řetězec ve skriptování bash shell.
V některých případech může být nutné rozdělit data řetězce, abychom mohli provádět některé specifické úkoly. Většina programovacích jazyků obsahuje vestavěnou funkci 'split' pro rozdělení libovolných dat řetězce na více částí. Tento typ vestavěné funkce však bash neobsahuje. Ale můžeme použít oddělovače k rozdělení libovolných dat řetězce ve skriptování bash. Oddělovač může být buď jeden znak, nebo řetězec s více znaky.
Podívejte se na níže uvedené metody, abyste pochopili, jak rozdělit řetězec v bash shellu:
Rozdělení pomocí proměnné $IFS
Níže jsou uvedeny kroky k rozdělení řetězce v bash pomocí $IFS:
- $IFS je speciální interní proměnná, která se používá k rozdělení řetězce na slova. $IFS proměnná se nazývá ' Interní oddělovač pole ' což určuje, jak Bash rozpoznává hranice. $IFS se používá k přiřazení konkrétního oddělovače [ IFS='' ] pro dělení řetězce. Prázdné místo je výchozí hodnotou $IFS. Jako oddělovač však můžeme použít i hodnoty jako ' ', ' ', '-' atd.
- Po přiřazení oddělovače lze řetězec číst dvěma možnostmi: '-r' a '-a'. tj., read -ra ARR <<< '$str' .
Zde se volba '-r' používá k definování, že zpětné lomítko () je znak spíše než znak escape. Volba '-a' se používá k definování, že slova (oddělená $IFS) jsou přiřazena k sekvenčnímu indexu pole začínajícího nulou. - Poté použijeme bash smyčku „for“ pro přístup k tokenům, které jsou rozděleny do pole.
Pojďme pochopit tento mechanismus pomocí několika příkladů:
Příklad 1: Bash rozdělený řetězec mezerou
V tomto příkladu je řetězec rozdělen pomocí oddělovače znaků mezery.
Bash skript
#!/bin/bash #Example for bash split string by space read -p 'Enter any string separated by space: ' str #reading string value IFS='' #setting space as delimiter read -ra ADDR <<<'$str' #reading str as an array tokens separated by ifs for i in '${addr[@]}'; #accessing each element of do echo '$i' done < pre> <p> <strong>Output</strong> </p> <p>If we input a string 'We welcome you on Javatpoint', the output will look like this:</p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string.webp" alt="Bash Split String"> <h3>Example 2: Bash Split String by Symbol</h3> <p>In some cases, we may have a requirement to split a string by other delimiters such as a symbol or specific character. In this example, a string is split using a comma (,) symbol character as a delimiter.</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example for bash split string by Symbol (comma) read -p 'Enter Name, State and Age separated by a comma: ' entry #reading string value IFS=',' #setting comma as delimiter read -a strarr <<<'$entry' #reading str as an array tokens separated by ifs echo 'name : ${strarr[0]} ' 'state ${strarr[1]} 'age ${strarr[2]}' < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-2.webp" alt="Bash Split String"> <h2>Split without $IFS variable</h2> <p>In bash, a string can also be divided without using $IFS variable. The 'readarray' command with -d option is used to split the string data. The -d option is applied to define the separator character in the command like $IFS. Moreover, the bash loop is used to print the string in split form.</p> <p>Let's understand this logic with the help of some example:</p> <h3>Example 1: Bash Split String by Symbol</h3> <p>This example defines how a string value can be split without using $IFS. As per the script, a text value should be entered with the colon (:) sign so that it can be split. Check out the bash script below:</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example for bash split string without $IFS read -p 'Enter any string separated by colon(:) ' str #reading string value readarray -d : -t strarr <<<'$str' #split a string based on the delimiter ':' printf ' ' #print each value of array with help loop for (( n="0;" < ${#strarr[*]}; n++ )) do echo '${strarr[n]}' done pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-3.webp" alt="Bash Split String"> <h3>Example 2: Bash Split String by another string</h3> <p>In this example, we have used idiomatic expressions where parameter expansion has completed.</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example for bash split string by another string str='WeLearnWelcomeLearnYouLearnOnLearnJavatpoint' delimiter=Learn s=$str$delimiter array=(); while [[ $s ]]; do array+=( '${s%%'$delimiter'*}' ); s=${s#*'$delimiter'}; done; declare -p array </pre> <p>In this bash script, we have used the following Parameter- Expansions:</p> <ul> <tr><td>${parameter%%word}</td> <br> It removes the longest matching suffix pattern. </tr><tr><td>${parameter#word}</td> <br> It removes the shortest matching prefix pattern. </tr></ul> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-4.webp" alt="Bash Split String"> <h3>Example 3: Bash Split String using Trim Command</h3> <p>In this example, we have used trim (tr) command to split a string. Instead of using the read command, the trim command is used to split a string on the delimiter.</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example to split a string using trim (tr) command my_str='We;welcome;you;on;javatpoint.' my_arr=($(echo $my_str | tr ';'' ')) for i in '${my_arr[@]}' do echo $i done </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-5.webp" alt="Bash Split String"> <h4>Note: It should be noted that array elements are divided on 'space delimiter' if we apply a trim command to split a string. For example, elements like 'Windows OS' will be treated as two different words.</h4> <h2>Conclusion</h2> <p>In this topic, we demonstrated how to split a string in bash scripting with different types of scenarios with or without using delimiter.</p> <hr></'$str'></pre></'$entry'></pre></'$str'>
V tomto bash skriptu jsme použili následující rozšíření parametrů:
Odstraní nejdelší odpovídající vzor přípony.
Odstraní nejkratší odpovídající vzor předpony.
Výstup
Příklad 3: Bash Split String pomocí Trim Command
V tomto příkladu jsme použili příkaz trim (tr) k rozdělení řetězce. Místo použití příkazu read se příkaz trim používá k rozdělení řetězce na oddělovači.
Bash skript
#!/bin/bash #Example to split a string using trim (tr) command my_str='We;welcome;you;on;javatpoint.' my_arr=($(echo $my_str | tr ';'' ')) for i in '${my_arr[@]}' do echo $i done
Výstup
Poznámka: Je třeba poznamenat, že prvky pole jsou rozděleny na 'oddělovač mezer', pokud použijeme příkaz trim k rozdělení řetězce. Například prvky jako „Windows OS“ budou považovány za dvě různá slova.
Závěr
V tomto tématu jsme ukázali, jak rozdělit řetězec ve skriptování bash s různými typy scénářů s nebo bez použití oddělovače.
\'$str\'>\'$entry\'>'$str'>