按第一次出现的分隔符分割字符串

按第一次出现的分隔符分割字符串

我有一个下一个格式的字符串

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包含您想要的两个子字符串。

相关内容