구분 기호의 첫 번째 발생으로 문자열 분할

구분 기호의 첫 번째 발생으로 문자열 분할

다음 형식의 문자열이 있습니다

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/'

어디에 원하는 두 개의 하위 문자열이 포함되어 있습니다 \1.\2

관련 정보