我尝试使用正则表达式
从以下文件内容中提取[[ "$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
答案 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
。要匹配单个空格字符,请使用"\ "
(不带双引号!)。
我不确定?
内的问号()
是什么。
在()
内,*
必须与双引号"
不匹配,否则您将获得超出结束"
的字符。
答案 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