다음 형식의 문자열이 있습니다.
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