使用 awk 提取包含空格的字符串中特定子字符串后面的值

使用 awk 提取包含空格的字符串中特定子字符串后面的值

我有这个单行字符串。

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)shbash您可以创建数组而不是多个变量

相关内容