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