提取参数
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
^\s*cf\s+cups\s+
:搜索以cf cups ...
开头的行
\s+(.+)\s
:提取第三列(由\s
(空格)分隔)为</code></li>
<li><code>-p\s+('"'"'.+'"'"')
: 在 -p
之后将 ''
之间的内容提取为 </code>(包括 <code>''
)
我正致力于在 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
^\s*cf\s+cups\s+
:搜索以cf cups ...
开头的行
\s+(.+)\s
:提取第三列(由\s
(空格)分隔)为</code></li> <li><code>-p\s+('"'"'.+'"'"')
: 在-p
之后将''
之间的内容提取为</code>(包括 <code>''
)