SED:替换多个文件的semvers

问题描述 投票:1回答:2

[context]我的脚本需要用commit sha替换多个.car名称的semvers。简而言之,我希望每个dev_CA_1.0.0.car都变成dev_CA_6a8zt5d832.car

ADDING commit sha就在.car之前是微不足道的。这样,我最终得到dev_CA_1.0.0_6a8zt5d832.car

find . -depth -name "*.car" -exec sh -c 'f="{}"; \
mv -- "$f" $(echo $f | sed -e 's/.car/_${CI_COMMIT_SHORT_SHA}.car/g')' \;

但是我发现REPLACE非常困难。我误解了sed的哪个方面:

find . -depth -name "*.car" -exec sh -c 'f="{}"; \
mv -- "$f" $(echo $f | sed -r -E 's/[0-9\.]+.car/${CI_COMMIT_SHORT_SHA}.car/g')

或此

find . -depth -name "*.car" -exec sh -c 'f="{}"; \
mv -- "$f" $(echo $f | sed -r -E 's/^(.*_)[0-9\.]+\.car/\1${CI_COMMIT_SHORT_SHA}\.car/g')' \;
no matches found: f="{}"; mv -- "$f" $(echo $f | sed -r -E ^(.*_)[0-9.]+.car/1684981321531.car/g)

或多个变体:

  • \转义(例如\\.
  • [()转义(例如\()(我读到某个地方,与sed进行正则表达式分组需要对()进行一些注意))

还有更直接的方法吗?

编辑

[$f进入sed的路径看起来像]

./somewhere/some_project_CA_1.2.3.car
./somewhere_else/other_project_CE_9.2.3.car
regex bash sed substitution
2个回答
1
投票

您可以使用

sed "s/_[0-9.]\{1,\}\.car$/_${CI_COMMIT_SHORT_SHA}.car/g"

请参见online demo

[此处,sed与匹配的POSIX ERE表达式一起使用

  • _-下划线
  • [[0-9.]\{1,\}-1个或多个数字或点]
  • [\.car-.car(请注意,必须对文字.进行转义!.模式与任何字符匹配)]
  • [$-字符串结尾。

0
投票

您可以尝试这个吗:

export CI_COMMIT_SHORT_SHA=6a8zt5d832
find . -depth -name "*.car" -exec sh -c \
 'f="{}"; echo mv "$f" "${f%_*}_${CI_COMMIT_SHORT_SHA}.car"' \;

一旦对结果满意,请删除echo

© www.soinside.com 2019 - 2024. All rights reserved.