在字符串正则表达式 busybox 之间提取字符串

在字符串正则表达式 busybox 之间提取字符串

我正在尝试使用 BusyBox 上的正则表达式从两个字符串之间提取一个字符串。我已经能够在本地完成

extract_string=$(echo $content | grep -P '(?<=CURRENT_VERSION ")(.*)(?=")' -o)

但遗憾的是这个 BusyBox 版本的grep命令不支持该-P选项。我可以使用sed,awkgrep.

细绳:#define CURRENT_VERSION "1.0.0.2" some other random text

输出:1.0.0.2

有人知道我可以实现这一目标的另一种方法吗?

操作系统:内核2.6.x

公用事业:来自 busybox 1.2x

答案1

sed

extract_string=$(
  printf '%s\n' "$content" |
    sed -n 's/.*CURRENT_VERSION "\([^"]*\).*/\1/p'
)

awk

extract_string=$(
  printf '%s\n' "$content" |
    awk -F'"' '/CURRENT_VERSION/{ print $2 }'
)

答案2

由于要提取的文本位于变量内部,因此调用 sed、awk 或 cut 等外部命令确实浪费了处理时间。

等效的正则表达式可以在多个 shell(ksh、bash、zsh)中使用:

re='CURRENT_VERSION "(.*)".*'
[[ $content =~ $re ]] && echo "${BASH_REMATCH[1]}"

如果您的 shell 没有这样的功能,请使用:

out1=${content#*\"}; out2=${out1%\"*}
[[ ${content} -ne ${#out1} ]] && 
    [[ ${#out1} -ne ${#out2} ]] &&
        echo "$out2"

最终测试确保两者都"在字符串中生成了更改,只有这样,才会打印提取的字符串。

"这将输出第一个和最后一个之间的文本"

答案3

你可以使用cut和 来做到这一点awk

content='#define CURRENT_VERSION "1.0.0.2" 一些其他随机文本'

cut:

extract_string=$(echo $content|cut -d '"' -f2)

awk:

extract_string=$(echo $content|awk '{for(i=1;i<=NF;i++)if($i~/CURRENT_VERSION/)print $(i+1)}')

相关内容