![](/img/trans.png)
[英]find and replace string (regex) across multiple files in linux using sed
[英]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.