次の形式の文字列があります
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