使用 shell 脚本,我试图在文件中搜索字符串,然后在变量中返回该值,以便我可以在 shell 脚本中操作它。
我正在使用一个dojo 构建脚本,这个脚本需要为dojo 定义一个版本号。默认情况下,构建脚本将版本号定义为 0.0.0.dev。我想要做的是在我的原始 dojo 文件中搜索 dojo.version 的定义,然后使用该值手动将我编译的构建的版本号设置为该值。
有什么建议么?
既然你标记为shell
,那就让它成为 bash ;这是要查找的关键正则表达式:dojo\.version[\ \t]*=[\ \t]*{
简而言之; 以下是我测试的两个版本的解决方案:
# grep -A20 includes comments, excluding these by following
flattenedlines=$(line=$(grep -nRe "dojo\.version[\ \t]*=[\ \t]*{" *); head -n `echo 20+$(echo $line|cut -d ":" -f2)|bc` $(echo $line|cut -d ":" -f1) | tail -n 21| grep -v "\/\/")
echo $flattenedlines | sed "s/'/\"/" | sed 's/.*major[\ \t]*:[\ \t]*\([0-9]*\).*minor[\ \t]*:[\ \t]*\([0-9]*\).*patch[\ \t]*:[\ \t]*\([0-9]*\).*flag[\ \t]*:[^"]*"\([^"]*\).*/\1 - \2 - \3 - \4/'
## result ## :"nMajor - nMinor - nPatch - szFlag"
有两个不同的版本,我个人已经看过了。版本 1.4.0 和 1.7.2 使用了两个不同的文件(我相信至少从 1.2 开始这是相当一致的,1.6 未成年人是转折点)
使用这个命令遍历 dojo/_base/ 目录,它应该给你一个文件和行号,以及找到的表达式之后的行子集。这是基于使用非压缩 sdk的事实。
dojobase="/var/www/dojotoolkit/dojo"
#command will return similar to following
# for 1.4.2 : "_loader/bootstrap.js:208: dojo.version = {"
# for 1.7.2 : "kernel.js:97: dojo.version = {"
pushd $dojobase/dojo/_base
lines=$(grep -A20 -Re "dojo\.version[\ \t]*=[\ \t]*{" *)
知道,这是要解析的文本
dojo.version = {
// undefined
// number of lines
// with comments
major: 1, minor: 7, patch: 2, flag: "",
revision: rev ? +rev[0] : NaN,
toString: function(){
var v = dojo.version;
return v.major + "." + v.minor + "." + v.patch + v.flag + " (" + v.revision + ")"; // String
}
};
使$lines
缓冲区看起来像这样:
dojo.version = { _loader/bootstrap.js- // summary: _loader/bootstrap.js- // version number of dojo _loader/bootstrap.js- // major: Integer _loader/bootstrap.js- // Major version. If total version is "1.2.0beta1", will be 1 _loader/bootstrap.js- // minor: Integer _loader/bootstrap.js- // Minor version. If total version is "1.2.0beta1", will be 2 _loader/bootstrap.js- // patch: Integer _loader/bootstrap.js- // Patch version. If total version is "1.2.0beta1", will be 0 _loader/bootstrap.js- // flag: String _loader/bootstrap.js- // Descriptor flag. If total version is "1.2.0beta1", will be "beta1" _loader/bootstrap.js- // revision: Number _loader/bootstrap.js- // The SVN rev from which dojo was pulled _loader/bootstrap.js- major: 1, minor: 4, patch: 0, flag: "dev", _loader/bootstrap.js- revision: rev ? +rev[0] : NaN, _loader/bootstrap.js- toString: function(){ _loader/bootstrap.js- with(d.version){ _loader/bootstrap.js- return major + "." + minor + "." + patch + flag + " (" + revision + ")"; // String _loader/bootstrap.js- } _loader/bootstrap.js- } _loader/bootstrap.js- }
使用 sed,这是一行一行的,如下所示:
major=$(echo $lines | sed 's/.*major[\ ]*:[^0-9]*\([0-9]\)*,.*/\1/')
minor=$(echo $lines | sed 's/.*minor[\ ]*:[^0-9]*\([0-9]\)*,.*/\1/')
patch=$(echo $lines | sed 's/.*patch[\ ]*:[^0-9]*\([0-9]\)*,.*/\1/')
您可以通过将版本作为参数传递给构建脚本来覆盖该版本。
这是一个使用 bat 文件的 windows 示例
build.bat profileFile=my.profile.js action=release releaseDir=../../../release/
releaseName=rel copyTests=false optimize=comments
cssOptimize=comments version=THE_VERSION_YOU_WANT
我对这个问题的回答显示了一个覆盖版本的 ANT 构建。