다음 형식의 문자열이 있습니다.
id;some text here with possible ; inside
를 처음으로 두 문자열로 나누고 싶습니다 ;. 따라서 다음 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당신이 원하는 한 두 개의 문자열이 포함되어 있습니다.
답변
표준 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