구분 기호가 처음 나타날 때 문자열 분리


54

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

id;some text here with possible ; inside

를 처음으로 두 문자열로 나누고 싶습니다 ;. 따라서 다음 id과 같아야합니다.some text here with possible ; inside

문자열을 분할하는 방법을 알고 cut -d ';' -f1있지만 (예 :) ;왼쪽 부분에 있기 때문에 더 많은 부분으로 분할됩니다 .


문자열이 분리 된 후 "id"로 무엇을 하시겠습니까? 변수에 할당하고 인쇄하고 싶습니까?
카오스 데몬

나는 거 두 변수를 가지고 : idstring
gakhov

답변:


65

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

3
큰! 그것은 매력처럼 작동합니다! 내가 read사용 하고 있기 때문에 를 선택합니다 bash. @manatwork 감사합니다!
gakhov

cut방법은 "$ s"에 개행 문자가 포함되지 않은 경우에만 작동합니다. 읽기는 Bourne과 같은 쉘에 있습니다. <<<는 rc, zsh 및 bash 및 ksh93의 최신 버전이며 표준이 아닙니다.
Stéphane Chazelas

죄송합니다, @StephaneChazelas입니다. 내 마음에 있었다 -a언급 할 때 몇 가지 이유 bash들 ' read. (
아마도 여기서는 쓸모

$ s에 개행 문자가 포함되어 있으면 읽기 접근 방식이 작동하지 않는다는 것을 언급하지 않았습니다. 내 답변을 추가했습니다.
Stéphane Chazelas

1
나는 명령 -f 2-에서 후행 대시를 강조하고 싶습니다 string="$( cut -d ';' -f 2- <<< "$s" )"; echo "$string". 이것은 출력 문자열에서 나머지 구분 기호를 무시하는 것입니다. 의 매뉴얼 페이지를 볼 때 명확하지 않습니다cut
Steen

17

표준 sh (bash 포함) :

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

read기반 솔루션은 $sep공백, 탭 또는 줄 바꿈 이외 의 단일 문자 (및 일부 쉘, 단일 바이트) 값에 대해 $s작동 하며 줄 바꿈 문자가 포함되지 않은 경우에만 작동합니다.

cut기반 솔루션은 $s개행 문자가 포함되지 않은 경우에만 작동합니다 .

sed의 모든 값을 처리하는 솔루션을 고안 할 수는 $sep있지만 셸에서 기본적으로 지원되는 경우에는 그만한 가치가 없습니다.


6

앞에서 언급했듯이 idstring에 값을 할당하고 싶다

먼저 패턴을 변수에 할당하십시오 (예 : str)

    str='id;some text here with possible ; inside'
    id=${str%%;} 
    string=${str#;}

이제 각 변수에 값이 있습니다


명령에서 패턴을 얻는 경우 some_command
set-을

이 답변은 @StephaneChazelas와 어떻게 다릅니 까?
Bernhard

4

다른 솔루션 외에도 다음과 같은 것을 시도해 볼 수 있습니다 regex.

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

또는 정확히하려는 일에 따라

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

\1\2당신이 원하는 한 두 개의 문자열이 포함되어 있습니다.


1

표준 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.