使用shell脚本提取部分字符串

时间:2017-07-28 20:52:52

标签: linux shell awk

字符串:

"v1.0.20170728180812 latest ef1fc15"
"latest ef1fc15 v1.0.20170728180812-test"
"ef1fc15 v1.0.20170722150727 latest"

预期的字符串结果:

"v1.0.20170728180812"
"v1.0.20170728180812-test"
"v1.0.20170722150727"

代码:

string='latest ef1fc15 v1.0.20170728180812-test'
replace=$(echo $string | sed 's/v.*$//g')
echo $string | sed -e 's/$(echo $replace)//g'

谢谢你们! ;)

此脚本用于获取aws ecr的有效版本,并仅使用--apply将其部署到kubernetes(当使用“latest”时避免缓存)。

完整代码:

ecrVersions=$(aws ecr describe-images --repository-name <ECR_REPO_NAME> --image-ids imageTag=latest --output text)
appVersion=$(echo $ecrVersions | awk '{for (i=1;i<=NF;++i) {if($i~/^[v]/){print $i}}}')
echo $appVersion

3 个答案:

答案 0 :(得分:1)

使用awk

 awk '{for (i=1;i<=NF;++i) {if($i~/^[v]/){print $i}}}' yourfile.txt

这是:

  1. 按记录迭代文件记录(因为这是awk的作用)
  2. 迭代由默认值for (i=1;i<=NF;++i)
  3. 分隔的每个字段
  4. 测试该字段是否以&#34; v&#34;:if($i~/^[v]/)
  5. 开头
  6. 如果是,则打印字段值print $i
  7. 我确定sed可以快速完成这项工作。

答案 1 :(得分:1)

POSIX shell代码。切断v及之前的任何内容,(然后添加v以替换丢失的那个),然后切断任何以及之后的任何内容:

string=v"${string##*v}"
string="${string%% *}"

演示:

for string in "v1.0.20170728180812 latest ef1fc15" \
              "latest ef1fc15 v1.0.20170728180812-test" \
              "ef1fc15 v1.0.20170722150727 latest"; do 
    string=v"${string##*v}"
    string="${string%% *}"
    echo $string
done

输出:

v1.0.20170728180812
v1.0.20170728180812-test
v1.0.20170722150727

答案 2 :(得分:0)

使用awk匹配功能:

awk '{match($0,"v[0-9][^\" ]+",a);print "\""a[0]"\""}' file