SED: заменить semvers нескольких файлов - PullRequest
1 голос
/ 30 апреля 2020

[ context ] Мой скрипт должен заменить semvers нескольких .car имен на commit sha . Короче говоря, я хотел бы, чтобы каждый dev_CA_1.0.0.car становился dev_CA_6a8zt5d832.car

ДОБАВЛЕНИЕ commit ша прямо перед тем, как .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')' \;

Но мне невероятно сложно ЗАМЕНИТЬ . Какой аспект 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)

или несколько вариантов:

  • \ escape ( например, \\.)
  • ( и ) экранирование (например, \() (я где-то читал, что группировка регулярных выражений с sed требует некоторой осторожности с ())

Есть ли более прямой способ сделать это?

Редактировать

$f Входя в sed путь выглядит как

./somewhere/some_project_CA_1.2.3.car
./somewhere_else/other_project_CE_9.2.3.car

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы можете использовать

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

См. онлайн-демонстрацию

Здесь sed используется с выражением POSIX ERE, которое соответствует

  • _ - подчеркивание
  • [0-9.]\{1,\} - 1 или более цифр или точек
  • \.car - .car (обратите внимание, что литерал . должен быть экранированный! шаблон . соответствует любому символу)
  • $ - конец строки.
0 голосов
/ 30 апреля 2020

Можете ли вы попробовать это:

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

Удалите echo, как только вы будете удовлетворены результатом.

...