如何使用关键字进行字符串分隔?

vin*_*ins 0 unix bash shell ksh

我有STRING,如下所示.每个键之间没有特定的分隔符.唯一的方法是识别密钥使用关键字"key_1"或"key_2"等.

所有键都以"key_"开头,并且永远不会出现在另一个键的值中:

STRING="key_1=mislanious_string1 key_2=miscellaneous_string2"
Run Code Online (Sandbox Code Playgroud)

我想要输出如下.

echo $STRING1 应该打印:

key_1=mislanious_string1
Run Code Online (Sandbox Code Playgroud)

echo $STRING2 应该打印:

key_2=mislanious_string2
Run Code Online (Sandbox Code Playgroud)

例如:如果STRING ="key_1 = foobarzkey_2 = bash",则输出应该如下:STRING1 = key_1 = foobarz,STRING2 = key_2 = bash.

可能有更多的键,如key_1,key_2,key_3等.每个键以"key_"开头,并且永远不会出现在另一个键的值中:

在UNIX bash shell中怎么做?

anu*_*ava 6

使用grep -P(PCRE)支持输入中的多个键值对:

STRING="key_1=mislanious_string1key_2=miscellaneous_string2key_3=fookey_4=BASH"
grep -oP 'key_[^=]+=.*?(?=key_|$)' <<< "$STRING"
key_1=mislanious_string1
key_2=miscellaneous_string2
key_3=foo
key_4=BASH
Run Code Online (Sandbox Code Playgroud)

要将它们存储到BASH数组中,您可以使用:

read -d '' -ra arr < <(grep -oP 'key_[^=]+=.*?(?=key_|$)' <<< "$STRING")
printf "%s\n" "${arr[@]}"
key_1=mislanious_string1
key_2=miscellaneous_string2
key_3=foo
key_4=BASH

declare -p arr
declare -a arr='([0]="key_1=mislanious_string1" [1]="key_2=miscellaneous_string2" [2]="key_3=foo" [3]="key_4=BASH")'
Run Code Online (Sandbox Code Playgroud)

UPDATE ::这是一种纯粹的BASH(非gnu)分割这些字符串的方法.我们首先在每次出现key_字符串之前插入一个不可见的字符,然后使用它来分割字符串:

STRING="key_1=mislanious_string1key_2=miscellaneous_string2key_3=fookey_4=BASH"
c=$'\x06'
s="${STRING//key_/${c}key_}"
arr=()
while [[ "$s" =~ ${c}(key_[^=]+=[^${c}]+)(.*) ]]; do
   arr+=( "${BASH_REMATCH[1]}" )
   s="${BASH_REMATCH[2]}"
done
Run Code Online (Sandbox Code Playgroud)

然后测试:

printf "<%s>\n" "${arr[@]}"
<key_1=mislanious_string1>
<key_2=miscellaneous_string2>
<key_3=foo>
<key_4=BASH>
Run Code Online (Sandbox Code Playgroud)