V tejto téme sme definovali, ako rozdeliť reťazec v skriptovaní bash shell.
V niektorých prípadoch možno budeme musieť rozdeliť údaje reťazca, aby sme mohli vykonávať niektoré špecifické úlohy. Väčšina programovacích jazykov obsahuje vstavanú funkciu „split“ na rozdelenie ľubovoľných údajov reťazca na viacero častí. Bash však takýto typ vstavanej funkcie neobsahuje. Môžeme však použiť oddeľovače na rozdelenie akýchkoľvek údajov reťazca v skriptovaní bash. Oddeľovač môže byť buď jeden znak, alebo reťazec s viacerými znakmi.
Pozrite si nižšie uvedené metódy, aby ste pochopili, ako rozdeliť reťazec v bash shell:
Rozdelenie pomocou premennej $IFS
Nasledujú kroky na rozdelenie reťazca v bash pomocou $IFS:
- $IFS je špeciálna interná premenná, ktorá sa používa na rozdelenie reťazca na slová. $IFS premenná sa nazýva ' Vnútorný oddeľovač polí ktorý určuje, ako Bash rozpozná hranice. $IFS sa používa na priradenie špecifického oddeľovača [ IFS='' ] na delenie struny. Medzera je predvolená hodnota $IFS. Ako oddeľovač však môžeme použiť aj hodnoty ako ' ', ' ', '-' atď.
- Po priradení oddeľovača je možné reťazec prečítať dvoma možnosťami: '-r' a '-a'. t.j. read -ra ARR <<< '$str' .
Tu sa voľba '-r' používa na definovanie, že spätná lomka () je znak a nie znak escape. Voľba '-a' sa používa na definovanie, že slová (oddelené $IFS) sú priradené k sekvenčnému indexu poľa začínajúceho nulou. - Potom použijeme bash cyklus „for“ na prístup k tokenom, ktoré sú rozdelené do poľa.
Poďme pochopiť tento mechanizmus pomocou niekoľkých príkladov:
Príklad 1: Bash rozdeliť reťazec medzerou
V tomto príklade je reťazec rozdelený pomocou oddeľovača medzery.
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 skripte sme použili nasledujúce rozšírenia parametrov:
Odstraňuje najdlhší zodpovedajúci vzor prípony.
Odstráni najkratší zodpovedajúci vzor predpony.
Výkon
Príklad 3: Bash Split String pomocou príkazu Trim
V tomto príklade sme použili príkaz trim (tr) na rozdelenie reťazca. Namiesto použitia príkazu read sa príkaz trim používa na rozdelenie reťazca na oddeľovač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ýkon
Poznámka: Je potrebné poznamenať, že prvky poľa sú rozdelené na „oddeľovač medzery“, ak použijeme príkaz trim na rozdelenie reťazca. Napríklad prvky ako „Windows OS“ sa budú považovať za dve rôzne slová.
Záver
V tejto téme sme demonštrovali, ako rozdeliť reťazec v bash skriptovaní s rôznymi typmi scenárov s alebo bez použitia oddeľovača.
\'$str\'>\'$entry\'>'$str'>