我想编写一个 POSIX shell ( /bin/sh
),它将输入分支名称。这些分支是发布分支,它们的格式为release/yymmDD-HHMMSS
,例如release/240321-170138
,/release/240405-095914
。Agit branch -A | grep release
为我找到了所有这些:
origin/release/230823-184353
origin/release/230825-154255
origin/release/230829-112434
origin/release/230905-101013
origin/release/230913-114212
origin/release/230915-105323
origin/release/230920-115230
origin/release/230927-115028
origin/release/230927-125843
origin/release/231016-145729
origin/release/231019-110314
origin/release/231030-150735
origin/release/231102-125814
origin/release/231109-114532
origin/release/231122-120112
origin/release/231123-140553
origin/release/231204-143206
origin/release/231213-153646
origin/release/231229-123237
origin/release/240112-160116
origin/release/240123-093125
origin/release/240201-171058
origin/release/240209-140214
origin/release/240216-121012
origin/release/240222-134817
origin/release/240307-115055
origin/release/240320-111003
origin/release/240321-170138
origin/release/240405-095914
现在假设我的脚本已被赋予分支名称release/240216-121012
。我希望以列表或数组的形式(不确定 POSIX shell 中正确的术语是什么)接收按时间顺序遵循此分支名称的所有分支,在本例中这也意味着按字典顺序,至少到 2099 年:
origin/release/240222-134817
origin/release/240307-115055
origin/release/240320-111003
origin/release/240321-170138
origin/release/240405-095914
什么是快速而优雅的方法来做到这一点?我目前设想将所有这些结果放入一个数组中,然后从末尾向后循环,直到遇到我想要的分支。也许用awk
orsed
和xargs
可以解决这个问题?
sort
一种用于确保正确顺序、sed
标记入口点并awk
在标记后打印行的方法(此处PP<=
)。数据
更改顺序以确保排序按预期进行
您可以在单个 awk 中执行此操作,无需使用多个命令:
我将
AWK
按照以下方式利用 GNU 来完成这项任务,让file.txt
内容成为然后
给出输出
说明:我使用
>
行 ($0
) 和串联之间的比较origin/
,如果按字典顺序排序时行位于串联之后,则该比较成立。无论内部行的顺序如何,该解决方案都可以工作file.txt
,并且可以保留输入文件的顺序。(在 GNU Awk 5.1.0 中测试)