カンマまたはアンダースコアで区切られた複数の単語を含む長い文字列があるとします。この文字列を分割して、個々の単語を抽出します。
Internal Field Separator(IFS)とreadコマンドを使用してbashで文字列を分割するか、trコマンドを使用できます。例を挙げてその方法を紹介しましょう。
方法1:Bashで読み取りコマンドを使用して文字列を分割する
読み取りコマンドを使用して文字列を分割するためのサンプルスクリプトは次のとおりです。
#!/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
文字列を分割する部分はここにあります:
IFS=';' read -ra my_array <<< "$my_string"
説明させてください。 IFSは、文字列を分割する区切り文字を決定します。私の場合、それはセミコロンです。スペース、タブ、カンマ、さらには文字など、好きなものを使用できます。
readコマンドのIFSは、区切り文字で入力を分割します。 readコマンドは生の入力を読み取り(オプション-r)、バックスラッシュをエスケープ文字として扱うのではなく、文字通りに解釈します。オプション-awithreadコマンドは、読み取られた単語をbashの配列に格納します。
簡単に言うと、長い文字列は区切り文字で区切られたいくつかの単語に分割され、これらの単語は配列に格納されます。
これで、配列にアクセスして任意の単語を取得したり、bashのforループを使用して、上記のスクリプトで行ったようにすべての単語を1つずつ出力したりできます。
上記のスクリプトの出力は次のとおりです。
Ubuntu
Linux Mint
Debian
Arch
Fedora
方法2:Bashでtrコマンドを使用して文字列を分割する
これは、tr(変換)コマンドを使用したbash分割文字列の例です。
#!/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
この例は、前の例とほとんど同じです。 readコマンドの代わりに、trコマンドを使用して区切り文字で文字列を分割します。
このアプローチの問題は、配列要素が「スペース区切り文字」で分割されることです。そのため、「LinuxMint」などの要素は2つの単語として扱われます。
上記のスクリプトの出力は次のとおりです。
Ubuntu
Linux
Mint
Debian
Arch
Fedora
これが、bashで文字列を分割する最初の方法を好む理由です。
この簡単なbashチュートリアルが、文字列の分割に役立つことを願っています。関連する投稿で、bashでの文字列の比較についても読むことをお勧めします。
また、Bashをまったく使用したことがない場合は、Bashの初心者向けチュートリアルシリーズをお読みください。