提取参数

Extract arguments

我正致力于在 Cloud Foundry 中自动化 CUPS(创建用户提供的服务)。我有一个 cups.sh 文件,其中包含要为特定应用程序执行的相应 cf cups 命令。以下是示例:

cf cups service-A -p '{"uri": "https://sample uri"}'
cf cups service-B -p '{"uri": "https://sample uri","id": "abcd","token": "xyz"}'

我正在尝试编写将执行以下用例的脚本:

Parse the cups.sh, line by line and extract the service name (e.g. service-A) and the argument following -p (e.g: '{"uri": "https://sample uri","id": "abcd","token": "xyz"}').

我目前正在使用以下脚本:

File=cups.sh
sed -e 's/[[:space:]]*#.*// ; /^[[:space:]]*$/d' "$File" | while read line
do
    temp=$(echo $line | cut -d' ' -f4)
    echo $temp
done

这并不准确,因为它 returns 我 "https://sample uri"}'。是否有更准确的方法来提取参数 -p 并将其用于进一步的操作?

这是您要找的吗?

$ # only lines with successful substitutions will be printed
$ sed -n 's/.*service-A -p //p' ip.txt
'{"uri": "https://sample uri"}'
$ sed -n 's/.*service-B -p //p' ip.txt
'{"uri": "https://sample uri","id": "abcd","token": "xyz"}'

$ # to save results in variable
$ a=$(sed -n 's/.*service-A -p //p' ip.txt)
$ echo "$a"
'{"uri": "https://sample uri"}'

awk

$ awk -F"'" -v sq="'" '/service-A/{print sq  sq}' ip.txt
'{"uri": "https://sample uri"}'


将搜索词作为变量传递

$ st='service-A'
$ sed -n 's/.*'"$st"' -p //p' ip.txt
'{"uri": "https://sample uri"}'

$ awk -F"'" -v s="$st" -v sq="'" '[=12=] ~ s{print sq  sq}' ip.txt
'{"uri": "https://sample uri"}'

提取我们需要的:

$> sed -n -r '/^\s*cf\s+cups\s+.+.*-p\s+'"'"'.+'"'"'/{s/\s*cf\s+cups\s+(.+)\s.*-p\s+('"'"'.+'"'"').*$/ /;p}' cups.sh

service-A '{"uri": "https://sample uri"}'
service-B '{"uri": "https://sample uri","id": "abcd","token": "xyz"}'

现在,形成命令将所有结果推送到 2 个数组(_srv_cmd):

$> sed -n -r '/^\s*cf\s+cups\s+.+.*-p\s+'"'"'.+'"'"'/{s/\s*cf\s+cups\s+(.+)\s.*-p\s+('"'"'.+'"'"').*$/_srv+=('"'"''"'"') _cmd+=()/;p}' cups.sh

_srv+=('service-A') _cmd+=('{"uri": "https://sample uri"}')
_srv+=('service-B') _cmd+=('{"uri": "https://sample uri","id": "abcd","token": "xyz"}')

最后,将所有内容放入 bash 文件

#!/bin/bash

_fil=cups.sh
_srv=()
_cmd=()

eval `sed -n -r '/^\s*cf\s+cups\s+.+.*-p\s+'"'"'.+'"'"'/{s/\s*cf\s+cups\s+(.+)\s.*-p\s+('"'"'.+'"'"').*$/_srv+=('"'"''"'"') _cmd+=()/;p}' "$_fil"`

# test

_len=${#_srv[@]}
for (( i=-1;++i<_len; )); do
  echo ${_srv[$i]} ${_cmd[$i]}
done

  1. ^\s*cf\s+cups\s+:搜索以cf cups ...
  2. 开头的行
  3. \s+(.+)\s:提取第三列(由\s(空格)分隔)为</code></li> <li><code>-p\s+('"'"'.+'"'"'): 在 -p 之后将 '' 之间的内容提取为 </code>(包括 <code>''