Bash Regex如何检索值

时间:2016-08-05 02:42:24

标签: regex bash

我尝试使用正则表达式

从以下文件内容中提取
[[ "$podSpecValues" =~ 's\.name\s+=\s+"(.*?)"' ]] 
echo "${BASH_REMATCH[1]}"

这是我正在使用的bash,但回声没有返回任何内容。我在bash脚本中做错了什么?我基本上想从文件中提取s.name值,以便稍后在我的脚本中使用。

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Object>() {
    @Override
    protected Object doInBackground(Void... params) {
        // do your parallel task here
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        // and fetch result
    }
});

其中$ podSpecValues是上述文件的字符串。使用ActionDispatch::Response表示正则表达式应该是正确的。

上述文件的输出应为My Pod

由于 DMCApps

2 个答案:

答案 0 :(得分:3)

尝试:

[[ "$podSpecValues" =~ s\.name\ +=\ +\"([^\"]*)\" ]] && echo "${BASH_REMATCH[1]}"

这就是我所看到的:

$ echo ${BASH_VERSION} 
4.3.11(1)-release
$ podSpecValues='Pod::Spec.new do |s| s.name = "My Pod" s.version = "0.1.0" s.summary = "It does stuff"'
$ [[ "$podSpecValues" =~ s\.name\ +=\ +\"([^\"]*)\" ]] && echo "${BASH_REMATCH[1]}" | cat -A
My Pod$

关于OP的评论:

  • 从Bash 3.2开始,引用RHS模式会导致文字字符串匹配。我发现非常违反直觉。

  • Bash正则表达式风格将匹配空格[[:space:]]而不是\s。要匹配单个空格字符,请使用"\ "(不带双引号!)。

  • 我不确定?内的问号()是什么。

  • ()内,*必须与双引号"不匹配,否则您将获得超出结束"的字符。

    < / LI>

答案 1 :(得分:0)

为什么不使用sed

$echo 'Pod::Spec.new do |s| s.name = "My Pod" s.version = "0.1.0" s.summary = "It does stuff"' | sed 's/\(.* s\.name\s*=\s\"\)\([^"]*\)\(.*$\)/\2/g'
$My Pod