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中怎么做?
使用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)
归档时间: |
|
查看次数: |
157 次 |
最近记录: |