[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
您可以使用
sed "s/_[0-9.]\{1,\}\.car$/_${CI_COMMIT_SHORT_SHA}.car/g"
请参见online demo
[此处,sed
与匹配的POSIX ERE表达式一起使用
_
-下划线[0-9.]\{1,\}
-1个或多个数字或点]\.car
-.car
(请注意,必须对文字.
进行转义!.
模式与任何字符匹配)]$
-字符串结尾。您可以尝试这个吗:
export CI_COMMIT_SHORT_SHA=6a8zt5d832
find . -depth -name "*.car" -exec sh -c \
'f="{}"; echo mv "$f" "${f%_*}_${CI_COMMIT_SHORT_SHA}.car"' \;
一旦对结果满意,请删除echo
。