在Shell脚本中搜索字符串

时间:2012-06-21 15:21:55

标签: shell dojo

使用shell脚本,我试图在文件中搜索一个字符串,然后在变量中返回该值,以便我可以在shell脚本中操作它。

我正在使用dojo构建脚本,此脚本需要为dojo定义版本号。 默认情况下,构建脚本将版本号定义为0.0.0.dev。我想要做的是,在我的原始dojo文件中搜索dojo.version的定义,然后使用该值手动将我编译的构建的版本号设置为该值。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以通过将其作为参数传递给构建脚本来覆盖该版本。

这是使用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

我对此question的回答显示了一个覆盖版本的ANT版本。

答案 1 :(得分:0)

因为你标记为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/')