首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gawk gensub,如何用背靠背的类似捕获组替换一个或多个

gawk gensub,如何用背靠背的类似捕获组替换一个或多个
EN

Stack Overflow用户
提问于 2021-03-29 17:57:09
回答 1查看 89关注 0票数 1

好的,这是我又一次进化的git awk脚本。

代码语言:javascript
复制
$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
}

你可以一起跑

代码语言:javascript
复制
( 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不是我所需要的。我明白了:

代码语言:javascript
复制
::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.puml

changed-files键是正确的。并不是因为改变了--文件本身是正确的,仅仅是因为没有根改变的文件。产出应是:

代码语言:javascript
复制
::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或更多的匹配*,但这只是把一切搞砸了。

我应该怎么做才能得到想要的输出?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-29 18:46:07

您可以在gensub中使第一个捕获组可选,并确保在捕获组#1中捕获最后一个/

代码语言:javascript
复制
fn=gensub( /([[:alpha:][:digit:]\/-]+\/)?([[:alpha:][:digit:]-]+)\.puml$/,"\\1.svg/\\2-MODE.svg", "1", $2 )

注意:([[:alpha:][:digit:]\/-]+\/)?,它使这个组成为可选的,因此它也匹配user.pumlfoo.puml

有了这个改变,我得到了这个输出:

代码语言:javascript
复制
::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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66859213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档