【发布时间】:2020-07-21 03:09:58
【问题描述】:
我有一个具有如下功能的 bash 脚本:
sanitize(){
rb_reg="^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$"
if grep -Ex "${rb_reg}" "${1}/.ruby-version" > /dev/null 2>&1; then
sanitize_tmp="$(<"${1}"/.ruby-version)" &&
ruby_version="${sanitize_tmp//[^0-9\.]/}" &&
echo "Setting Ruby Version: ${ruby_version}"
else
echo "There was an error trying to sanitize a .ruby-version file"
echo "The file was: ${1}/.ruby-version"
exit 7
fi
}
我正在使用它来检查 .ruby-version 文件,然后将其中的版本设置为变量。 大多数情况下,这些文件将包含一些合理的内容,例如:2.0.0 可以正常工作。我想防御,不信任输入文件,所以尽可能检查/清理它。
两个问题:
如果由于某种原因,文件中有多个版本号位于多行,例如:
'2.0.0
1.0.0'
这会将它们粉碎在一起,当前正在删除空白并最终得到一个变量,例如:'2.0.01.0.0' 什么是只获取与正则表达式匹配的第一个版本号的好方法?
有没有更好的方法来做到这一点,也许完全在没有 grep 的 bash 中?感谢人们检查此类版本但不信任输入文件的任何示例。
【问题讨论】:
-
第一种情况不会发生,因为您的正则表达式都锚定在行首和行尾,加上 grep 的
-x选项要求整行匹配 - 除非可以有多行,否则是。 -
啊,很好。通过编辑使其更加清晰。是的,对于第一种情况,我说的是文件中的多行。所以正则表达式匹配第一个示例,然后文件有其他行。