我有这个单行字符串。
WordPress version: 5.5.3 Database revision: 48748 TinyMCE version: 4.9100 (49100-20200624) Package language: en_US
我想提取5.5.3和英文
这是我能想到的最接近的例子,其中空格是分隔符。
`awk -F" " '{print $3 $13 }' <<< 'WordPress version: 5.5.3 Database revision: 48748 TinyMCE version: 4.9100 (49100-20200624) Package language: en_US'`
返回
5.5.3en_US
我查看了其他示例,但一无所获。我宁愿不依赖任何计数($3 和 $13),而是取子字符串后的第一个值。在这种情况下,WordPress 版本:和软件包语言:
将这两个变量放入数组中会很棒。非常感谢您的帮助。
答案1
如果awk
没有要求,你可以用 将字符串拆分成子字符串grep
,
用 替换冒号,用=
替换空格。 可以用 评估输出,使其成为变量_
sed
eval
WordPress version: 5.5.3 -> WordPress_version=5.5.3
Database revision: 48748 -> Database_revision=48748
TinyMCE version: 4.9100 -> TinyMCE_version=4.9100
Package language: en_US -> Package_language=en_US
为了使其工作,您需要将变量名称与变量值区分开。
在此示例中,这是通过len
以下方式完成的:英文被视为价值
#!/bin/bash
# input string
text='WordPress version: 5.5.3 Database revision: 48748 TinyMCE version: 4.9100 (49100-20200624) Package language: en_US'
# variable length
len=6
# find variable names based on length
for var in $(echo "$text" | grep -oE "[^(0-9:)]{$((len+1)),}" | grep -oE '\S.*' | sed -n 's,\s,.,p')
do
# convert substrings and set variables name=value
eval "$(echo "$text" | grep -oE "$var:\s+\S+" | sed -nr 's,:\s+,=,p' | sed -n 's,\s,_,p')"
done
# print variable info
declare -p | grep -E 'declare -- [A-Za-z]+_\S+='
注意:eval
仅用于演示。以上代码与兼容(da)sh
。bash
您可以创建数组而不是多个变量