web-dev-qa-db-ja.com

区切り文字の最初の出現による文字列の分割

次の形式の文字列があります

id;some text here with possible ; inside

;の最初の出現によって2つの文字列に分割したいとします。したがって、次のようになります。idおよびsome text here with possible ; inside

文字列を分割する方法はわかっていますが(たとえば、cut -d ';' -f1を使用して)、左側の部分に;があるため、より多くの部分に分割されます。

57
gakhov

cutはこれに適したツールのように聞こえます:

bash-4.2$ s='id;some text here with possible ; inside'

bash-4.2$ id="$( cut -d ';' -f 1 <<< "$s" )"; echo "$id"
id

bash-4.2$ string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string"
some text here with possible ; inside

ただし、readの方が適しています。

bash-4.2$ IFS=';' read -r id string <<< "$s"

bash-4.2$ echo "$id"
id

bash-4.2$ echo "$string"
some text here with possible ; inside
74
manatwork

標準のsh(bashを含む)の場合:

sep=';'
case $s in
  (*"$sep"*)
    before=${s%%"$sep"*}
    after=${s#*"$sep"}
    ;;
  (*)
    before=$s
    after=
    ;;
esac

readベースのソリューションは、スペース、タブ、または改行以外の$sepの単一文字(および一部のシェルでは、シングルバイト)値に対して機能し、$sに改行が含まれていない場合にのみ機能します文字。

cutベースのソリューションは、$sに改行文字が含まれていない場合にのみ機能します。

sedソリューションは、$sepの値を使用してすべてのコーナーケースを処理するように考案できますが、そのためのシェルの組み込みサポートがある場合、それほど遠くに行く価値はありません。

18

すでに述べたように、値をidおよびstringに割り当てます。

最初にパターンを変数に割り当てます(たとえばstr)

    str='id;some text here with possible ; inside'
    id=${str%%;} 
    string=${str#;}

今、あなたはそれぞれの変数にあなたの値を持っています

6
user1678213

他のソリューションに加えて、regexベースの何かを試すことができます:

a="$(sed 's/;.*//' <<< "$s")"
b="$(sed 's/^[^;]*;//' <<< "$s")"

または、正確に何をしようとしているのかに応じて、

sed -r 's/^([^;]*);(.*)/\1 ADD THIS TEXT BETWEEN YOUR STRINGS \2/'

どこ \1および\2には、必要な2つの部分文字列が含まれています。

4
tojrobinson

標準bashのソリューション:

    text='id;some text here with possible ; inside'
    text2=${text#*;}
    text1=${text%"$text2"}

    echo $text1
    #=> id;
    echo $text2
    #=> some text here with possible ; insideDD
3
ethaning