我有一个下一个格式的字符串
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
除空格、制表符或换行符之外的单字符(对于某些 shell,单字节)值,并且仅当$s
不包含换行符时。
cut
$s
基于的解决方案仅在不包含换行符时才有效。
sed
可以设计解决方案来处理具有任何值的所有极端情况$sep
,但当 shell 中有内置支持时,不值得走那么远。
答案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
包含您想要的两个子字符串。