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

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

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

id;some text here with possible ; inside

の最初の発生でこれを2つの文字列に分割しようとしています;。したがって、次のようにidする必要があります。some text here with possible ; inside

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

答え1

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

答え2

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

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

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

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

sedソリューションは、すべての値を使用してすべての特別なケースを処理するように設計できますが、$sepシェルに組み込みサポートがある場合は、それまで進む価値はありません。

答え3

標準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

答え4

他のソリューションに加えて、以下に基づくregexソリューションを試すことができます。

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

または、実行したい操作に応じて使用できます。

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

どこに必要な2つの部分文字列が含まれています\1\2

関連情報