好的,这是我又一次进化的git awk脚本。
$2 ~ /\.puml$/ && $2 !~ /(theme|config)\.puml$/ \
{
fn=gensub( /([[:alpha:][:digit:]\/-]+)\/([[:alpha:][:digit:]-]+)\.puml$/,"\\1/.svg/\\2-MODE.svg", "g", $2 )
light=gensub(/MODE/, "light", "g", fn);
dark=gensub(/MODE/, "dark", "g", fn);
if( $1 !~ /^D$/ ) {
# light changed svg
lcs=lcs " " light
dcs=dcs " " dark
}
else {
lrs=lrs " " light
drs=drs " " dark
}
}
END {
printf "::set-output name=changed-files::%s\n::warning::%s\n", lcs, lcs
printf "::set-output name=changed-files::%s\n::warning::%s\n", dcs, dcs
printf "::set-output name=removed-files::%s\n::warning::%s\n", lrs, lrs
printf "::set-output name=removed-files::%s\n::warning::%s\n", drs, drs
}你可以一起跑
( cat << EOF
A .config/plantuml/theme.puml
M .github/workflows/main.yml
M .github/workflows/plantuml.yml
M README.md
A app/gradle.lockfile
A authn/gradle.lockfile
A docs/README.md
A docs/domain-model/README.md
A docs/domain-model/user.md
A docs/domain-model/user.puml
A docs/domain-model/foo.puml
M settings.gradle.kts
D user.puml
D foo.puml
EOF
) | awk -f git_file_changes.awk这是我得到的最接近工作的。问题是,如果puml文件位于根目录中,regex不是我所需要的。我明白了:
::set-output name=changed-files:: docs/domain-model/.svg/user-light.svg docs/domain-model/.svg/foo-light.svg
::warning:: docs/domain-model/.svg/user-light.svg docs/domain-model/.svg/foo-light.svg
::set-output name=changed-files:: docs/domain-model/.svg/user-dark.svg docs/domain-model/.svg/foo-dark.svg
::warning:: docs/domain-model/.svg/user-dark.svg docs/domain-model/.svg/foo-dark.svg
::set-output name=removed-files:: user.puml foo.puml
::warning:: user.puml foo.puml
::set-output name=removed-files:: user.puml foo.puml
::warning:: user.puml foo.pumlchanged-files键是正确的。并不是因为改变了--文件本身是正确的,仅仅是因为没有根改变的文件。产出应是:
::set-output name=changed-files:: docs/domain-model/.svg/user-light.svg docs/domain-model/.svg/foo-light.svg
::warning:: docs/domain-model/.svg/user-light.svg docs/domain-model/.svg/foo-light.svg
::set-output name=changed-files:: docs/domain-model/.svg/user-dark.svg docs/domain-model/.svg/foo-dark.svg
::warning:: docs/domain-model/.svg/user-dark.svg docs/domain-model/.svg/foo-dark.svg
::set-output name=removed-files:: .svg/user-light.svg .svg/foo-light.svg
::warning:: .svg/user-light.svg .svg/foo-light-svg
::set-output name=removed-files:: .svg/user-dark.svg .svg/foo-dark.svg
::warning:: .svg/user-dark.svg .svg/foo-dark.svg我确实尝试过使用0或更多的匹配*,但这只是把一切搞砸了。
我应该怎么做才能得到想要的输出?
发布于 2021-03-29 18:46:07
您可以在gensub中使第一个捕获组可选,并确保在捕获组#1中捕获最后一个/:
fn=gensub( /([[:alpha:][:digit:]\/-]+\/)?([[:alpha:][:digit:]-]+)\.puml$/,"\\1.svg/\\2-MODE.svg", "1", $2 )注意:([[:alpha:][:digit:]\/-]+\/)?,它使这个组成为可选的,因此它也匹配user.puml和foo.puml。
有了这个改变,我得到了这个输出:
::set-output name=changed-files:: docs/domain-model/.svg/user-light.svg docs/domain-model/.svg/foo-light.svg
::warning:: docs/domain-model/.svg/user-light.svg docs/domain-model/.svg/foo-light.svg
::set-output name=changed-files:: docs/domain-model/.svg/user-dark.svg docs/domain-model/.svg/foo-dark.svg
::warning:: docs/domain-model/.svg/user-dark.svg docs/domain-model/.svg/foo-dark.svg
::set-output name=removed-files:: .svg/user-light.svg .svg/foo-light.svg
::warning:: .svg/user-light.svg .svg/foo-light.svg
::set-output name=removed-files:: .svg/user-dark.svg .svg/foo-dark.svg
::warning:: .svg/user-dark.svg .svg/foo-dark.svghttps://stackoverflow.com/questions/66859213
复制相似问题