logo

Bash Split String

У цій темі ми визначили, як розділити рядок у сценаріях оболонки bash.

У деяких випадках нам може знадобитися розділити рядкові дані для виконання певних завдань. Більшість мов програмування містять вбудовану функцію split для поділу будь-яких рядкових даних на кілька частин. Однак bash не містить такого типу вбудованої функції. Але ми можемо використовувати роздільники, щоб розділити будь-які рядкові дані в сценаріях bash. Роздільником може бути як один символ, так і рядок із кількома символами.

Перегляньте наведені нижче методи, щоб зрозуміти, як розділити рядок в оболонці bash:

Розділити за допомогою змінної $IFS

Нижче наведено кроки для розділення рядка в bash за допомогою $IFS:

  • $IFS — це спеціальна внутрішня змінна, яка використовується для розбиття рядка на слова. Змінна $IFS називається ' Внутрішній роздільник полів ' який визначає, як Bash розпізнає межі. $IFS використовується для призначення конкретного розділювача [ IFS='' ] для поділу рядка. Пробіл є значенням за замовчуванням $IFS. Однак ми також можемо використовувати такі значення, як « », « », «-» тощо як роздільник.
  • Після призначення роздільника рядок можна читати двома параметрами: '-r' і '-a'. тобто, read -ra ARR <<< '$str' .
    Тут параметр '-r' використовується для визначення того, що зворотна коса риска () є символом, а не символом екранування. Параметр '-a' використовується для визначення того, що слова (розділені $IFS) присвоюються послідовному індексу масиву, який починається з нуля.
  • Потім ми застосовуємо цикл bash for для доступу до токенів, які розбиваються на масив.

Давайте зрозуміємо цей механізм на кількох прикладах:

Приклад 1: Bash розділяє рядок на пробіл

У цьому прикладі рядок розділено за допомогою роздільника пробілу.

Скрипт Bash

 #!/bin/bash #Example for bash split string by space read -p &apos;Enter any string separated by space: &apos; str #reading string value IFS=&apos;&apos; #setting space as delimiter read -ra ADDR &lt;&lt;<'$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 &apos;We welcome you on Javatpoint&apos;, 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 &apos;Enter Name, State and Age separated by a comma: &apos; entry #reading string value IFS=&apos;,&apos; #setting comma as delimiter read -a strarr &lt;&lt;<'$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 &apos;readarray&apos; 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&apos;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 &apos;Enter any string separated by colon(:) &apos; str #reading string value readarray -d : -t strarr &lt;&lt;<'$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=&apos;WeLearnWelcomeLearnYouLearnOnLearnJavatpoint&apos; delimiter=Learn s=$str$delimiter array=(); while [[ $s ]]; do array+=( &apos;${s%%&apos;$delimiter&apos;*}&apos; ); s=${s#*&apos;$delimiter&apos;}; 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=&apos;We;welcome;you;on;javatpoint.&apos; my_arr=($(echo $my_str | tr &apos;;&apos;&apos;
&apos;)) for i in &apos;${my_arr[@]}&apos; 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 &apos;space delimiter&apos; if we apply a trim command to split a string. For example, elements like &apos;Windows OS&apos; 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'>

У цьому сценарії bash ми використали такі розширення параметрів:

    ${parameter%%word}
    Він видаляє найдовший відповідний шаблон суфікса.${parameter#word}
    Він видаляє найкоротший відповідний шаблон префікса.

Вихід

Bash Split String

Приклад 3: Bash Split String за допомогою команди Trim

У цьому прикладі ми використали команду trim (tr), щоб розділити рядок. Замість використання команди read, команда trim використовується для розділення рядка на роздільник.

Скрипт Bash

 #!/bin/bash #Example to split a string using trim (tr) command my_str=&apos;We;welcome;you;on;javatpoint.&apos; my_arr=($(echo $my_str | tr &apos;;&apos;&apos;
&apos;)) for i in &apos;${my_arr[@]}&apos; do echo $i done 

Вихід

Bash Split String

Примітка. Слід зазначити, що елементи масиву поділяються на «роздільник пробілу», якщо ми застосовуємо команду trim для розділення рядка. Наприклад, такі елементи, як «ОС Windows», розглядатимуться як два різні слова.

Висновок

У цій темі ми продемонстрували, як розділити рядок у сценаріях bash із різними типами сценаріїв із використанням роздільника або без нього.