我正在尝试使用 BusyBox 上的正则表达式从两个字符串之间提取一个字符串。我已经能够在本地完成
extract_string=$(echo $content | grep -P '(?<=CURRENT_VERSION ")(.*)(?=")' -o)
但遗憾的是这个 BusyBox 版本的grep
命令不支持该-P
选项。我可以使用sed
,awk
和grep
.
细绳:#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)}')