簡體   English   中英

SED:替換多個文件的semvers

[英]SED: replace semvers of multiple files

[上下文] 我的腳本需要用commit sha替換多個.car名稱的semvers 簡而言之,我希望每個dev_CA_1.0.0.car都變成dev_CA_6a8zt5d832.car

.car之前添加提交 sha非常簡單。 有了這個,我最終得到了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')' \;

但我發現更換起來非常困難。 我誤解了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)

或多種變體:

  • \ escaping(例如\\.
  • () escaping(例如\( )(我在某處讀到正則表達式與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"

查看在線演示

在這里, sed與 POSIX ERE 表達式一起使用,它匹配

  • _ - 下划線
  • [0-9.]\{1,\} - 1 個或多個數字或點
  • \.car - .car (注意文字.必須轉義!a .模式匹配任何字符)
  • $ - 字符串結束。

你可以試試這個:

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

一旦您對結果感到滿意,請刪除echo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM