次の形式の文字列があります
id;some text here with possible ; inside
;
の最初の出現によって2つの文字列に分割したいとします。したがって、次のようになります。id
およびsome text here with possible ; inside
文字列を分割する方法はわかっていますが(たとえば、cut -d ';' -f1
を使用して)、左側の部分に;
があるため、より多くの部分に分割されます。
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
標準のsh(bashを含む)の場合:
sep=';'
case $s in
(*"$sep"*)
before=${s%%"$sep"*}
after=${s#*"$sep"}
;;
(*)
before=$s
after=
;;
esac
read
ベースのソリューションは、スペース、タブ、または改行以外の$sep
の単一文字(および一部のシェルでは、シングルバイト)値に対して機能し、$s
に改行が含まれていない場合にのみ機能します文字。
cut
ベースのソリューションは、$s
に改行文字が含まれていない場合にのみ機能します。
sed
ソリューションは、$sep
の値を使用してすべてのコーナーケースを処理するように考案できますが、そのためのシェルの組み込みサポートがある場合、それほど遠くに行く価値はありません。
すでに述べたように、値をidおよびstringに割り当てます。
最初にパターンを変数に割り当てます(たとえばstr)
str='id;some text here with possible ; inside'
id=${str%%;}
string=${str#;}
今、あなたはそれぞれの変数にあなたの値を持っています
他のソリューションに加えて、regex
ベースの何かを試すことができます:
a="$(sed 's/;.*//' <<< "$s")"
b="$(sed 's/^[^;]*;//' <<< "$s")"
または、正確に何をしようとしているのかに応じて、
sed -r 's/^([^;]*);(.*)/\1 ADD THIS TEXT BETWEEN YOUR STRINGS \2/'
どこ \1
および\2
には、必要な2つの部分文字列が含まれています。
標準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