首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重叠式,大部分是否定的

重叠式,大部分是否定的
EN

Unix & Linux用户
提问于 2021-03-16 19:38:17
回答 2查看 144关注 0票数 -3

不要重复自己!,哈哈,好吧,我在试着把我的2 github工作流合并到1中。我尝试了一些东西,但出于某种原因,我总是得到一些奇怪的专栏文章。回顾性地说,我可能是在分配而不是比较变量。我决定不用破译的代码来修饰这个问题。

awk正在以git diff-tree -r --no-commit-id --name-status HEAD | awk -f .github/files/changed.awk的形式运行,没有选项。git diff-tree的输出如下所示

代码语言: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 file.awk

这些都是我想出来的。

代码语言:javascript
复制
$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/ &&
$1 !~ /^D$/ {
  changed[++n]=$2
}
END {
  for ( i in changed ) result = result " " changed[i]
  printf "::set-output name=changed-files::%s\n", result
  printf "::warning::changed-files %s\n", result
}

输出

代码语言:javascript
复制
::set-output name=changed-files:: docs/domain-model/user.puml docs/domain-model/foo.puml
::warning::changed-files docs/domain-model/user.puml docs/domain-model/foo.puml
代码语言:javascript
复制
$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/ &&
$1 ~ /^D$/ {
  split($2, fn, ".")
  changed[++n]=fn[1] ".svg"
}
END {
  for ( i in changed ) result = result " " changed[i]
  printf "::set-output name=removed-files::%s\n", result
  printf "::warning::removed-files %s\n", result
}

输出

代码语言:javascript
复制
::set-output name=removed-files:: user.svg foo.svg
::warning::removed-files  user.svg foo.svg

这是当前工作流文件,如果有帮助的话。注意:对awk -f的更改是在当前损坏的分支中进行的,我将在完成后删除和压缩。

目标是使输出类似于下面的。我不关心行的顺序,列表中的空格非常重要,因为它可以传递给shell上的git addgit rmplantuml

代码语言:javascript
复制
# adding empty lines between just for readability here, comments do nott matter either
::set-output name=changed-files:: docs/domain-model/user.puml docs/domain-model/foo.puml
::warning::changed-files docs/domain-model/user.puml docs/domain-model/foo.puml

::set-output name=removed-files:: user.svg foo.svg
::warning::removed-files  user.svg foo.svg

你将如何去复制和改进它?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-03-16 20:15:44

通过一些改进,将两个部分合并为一个部分。

代码语言:javascript
复制
$2 ~ /\.puml$/ && $2 !~ /(theme|config)\.puml$/ \
{ if($1 !~ /^D$/) { result1= (result1==""? "" : result1 " ") $2 } else {
      split($2, fn, ".")
      result2=(result2==""? "" : result2 " ") fn[1] ".svg"
  }
}
END {
  printf "::set-output name=files::%s\n::warning::%s\n", result1, result1
  printf "::set-output name=files::%s\n::warning::%s\n", result2, result2
}
票数 1
EN

Unix & Linux用户

发布于 2021-03-18 20:38:31

因此,您有一个输入(或文件,git的结果)。

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

两个 awk脚本,它们对此输入执行类似的(但不同的)操作。

我假设您的目标是减少(尽可能)此脚本的操作。

前两行完全相等:

代码语言:javascript
复制
$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/

在此之后,一个脚本对而不是 $2采取行动(我假设这意味着删除)。另一个脚本对补码进行操作,$2D。可编码为:

代码语言:javascript
复制
{ if ( $1 ~ /^[D]$/ ) then { print "Deleted" } else { print "Changed" } }

或者,如果您想要一个更细粒度的选择:

代码语言:javascript
复制
{ if ( $1 ~ /^[D]$/  ) then { print "Deleted" } 
  if ( $1 ~ /^[MA]$/ ) then { print "Changed" } }

将每个文件存储在一个数组中并不是真正需要的,因为您需要的是一个分隔的文件列表。

这可以在循环中为每个输入行完成(内存更少,速度更快):

代码语言:javascript
复制
{ if ( $1 ~ /^[D]$/ ) then { deleted = deleted " " $2 } 
  if ( $1 ~ /^[A]$/ ) then { changed = changed " " $2 } }

当然,匹配可以是一个精确的字符串,而不是regex (更快),而且在更改的情况下,您还需要提取没有扩展名的文件名:

代码语言:javascript
复制
{ if ( $1 == "D" ) then { deleted = deleted " " $2 } 
  if ( $1 == "A" ) then { sub( /\.[^.]+$/, "", $2 ) ; 
                          changed = changed " " $2 ".svg"
                        }
}

测试所有想法的shell脚本可以是:

代码语言:javascript
复制
#!/bin/bash

a='\
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
'

printf '%s\n' "$a" | awk '
      $2  ~ /\.puml$/ &&
      $2 !~ /(theme|config)\.puml$/ {  
             if ( $1 == "D" ) { deleted = deleted " " $2 }
             if ( $1 == "A" ) { sub(/\.[^.]+$/, "", $2);
                                changed = changed " " $2 ".svg"
             }
      }
      END {
             printf "::set-output name=removed-files::%s\n", deleted
             printf "::warning::removed-files %s\n", deleted
             printf "::set-output name=changed-files::%s\n", changed
             printf "::warning::changed-files %s\n", changed
      }
    '
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/639619

复制
相关文章

相似问题

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