разделить строку в скрипте Bash

Thank you for reading this post, don't forget to subscribe!

Допу­стим, у вас есть длин­ная стро­ка с несколь­ки­ми сло­ва­ми, раз­де­лен­ны­ми запя­той или под­чер­ки­ва­ни­ем. Вы хоти­те раз­бить эту стро­ку и извлечь отдель­ные слова.

Вы може­те раз­де­лить стро­ки в bash, исполь­зуя раз­де­ли­тель внут­рен­них полей (IFS) и коман­ду чте­ния, или вы може­те исполь­зо­вать коман­ду обрез­ки. Поз­воль­те нам пока­зать вам, как это сде­лать на примерах.

 

Метод 1: Разделить строку с помощью команды чтения в Bash

Вот наш при­мер сце­на­рия для раз­де­ле­ния стро­ки с помо­щью коман­ды read:

 

Часть, кото­рая раз­би­ва­ет стро­ку, нахо­дит­ся здесь:

 

IFS опре­де­ля­ет раз­де­ли­тель, по кото­ро­му вы хоти­те раз­бить стро­ку. В нашем слу­чае это точ­ка с запя­той. Это может быть что угод­но: про­бел, табу­ля­ция, запя­тая или даже алфавит.

IFS в коман­де read раз­де­ля­ет вход­ные дан­ные в раз­де­ли­те­ле. Коман­да read чита­ет необ­ра­бо­тан­ный ввод (опция -r), поэто­му интер­пре­ти­ру­ет обрат­ную косую чер­ту бук­валь­но, а не обра­ба­ты­ва­ет их как escape-сим­вол. Опция -a с коман­дой read сохра­ня­ет сло­во read в массиве.

Про­ще гово­ря, длин­ная стро­ка раз­би­ва­ет­ся на несколь­ко слов, раз­де­лен­ных раз­де­ли­те­лем, и эти сло­ва хра­нят­ся в массиве.

Теперь вы може­те полу­чить доступ к мас­си­ву, что­бы полу­чить любое сло­во, кото­рое вы хоти­те, или исполь­зо­вать цикл for в bash, что­бы напе­ча­тать все сло­ва одно за дру­гим, как мы дела­ли в при­ве­ден­ном выше сценарии.

Вот вывод выше­при­ве­ден­но­го скрипта:

Ubuntu
Linux Mint
Debian
Arch
Fedora

 

Способ 2: разделить строку с помощью команды trim в Bash

Это при­мер раз­де­ле­ния стро­ки bash с исполь­зо­ва­ни­ем коман­ды trim (tr):

 

Этот при­мер почти такой же, как и преды­ду­щий. Вме­сто коман­ды чте­ния, коман­да trim исполь­зу­ет­ся для раз­де­ле­ния стро­ки на разделителе.

Про­бле­ма с этим под­хо­дом состо­ит в том, что эле­мент мас­си­ва раз­де­лен на «про­бел». Из-за это­го такие эле­мен­ты, как «Linux Mint», будут рас­смат­ри­вать­ся как два слова.

Вот вывод выше­при­ве­ден­но­го скрипта:

Ubuntu
Linux
Mint
Debian
Arch
Fedora