gpt4 book ai didi

regex - 按字符在字符类中的位置对 grep 匹配项进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:12 25 4
gpt4 key购买 nike

我正在尝试使用 grep 来实现以下目标:

给定 grep 模式,例如 [mM][aA][rRyY]$,而 abcMAydefmAyghimaR 都匹配模式,我想按字符在字符类中的位置对它们进行排序。例如,由于 [mM]m 出现在 M 之前,我希望 MAy 出现在最后;同样,由于 a 出现在 [aA] 中的 A 之前,我希望 maR 出现在 mAy 之前

这绝对不是典型的用法,但我想知道是否可以轻松完成?

最佳答案

您可以使用 awk 和排序通过修饰/取消修饰模式来定义自定义排序顺序。例如

$ echo {m,M}{a,A}{r,R,y,Y} | tr ' ' '\n' | 
awk -v pat='mMaArRyY' '{for(i=1;i<=length($0);i++)
printf "%s", index(pat,substr($0,i,1));
print "\t" $0}' |
sort | cut -f2-

mar
maR
may
maY
mAr
mAR
mAy
mAY
Mar
MaR
May
MaY
MAr
MAR
MAy
MAY

更新对于重叠模式 [aA][Aa],这里是更新的解决方案,为了展示顺序是如何确定的,我没有包括最后的剪辑。

$ echo {a,A}{A,a} | tr ' ' '\n' | 
awk -v pat='aA,Aa' 'BEGIN{n=split(pat,p,",")}
{for(i=1;i<=length($0);i++)
printf "%s",index(p[i],substr($0,i,1));
print "\t" $0}' |
sort

11 aA
12 aa
21 AA
22 Aa

下面是完整的脚本

$ cat text
abcMay defmaY ghiMark jklMaY443

$ grep -oE "\S*[mM][aA][rRyY]\S*" text
abcMay
defmaY
ghiMark
jklMaY443

提取模式匹配的子串

$ ... | sed -r 's/(\S*([mM][aA][rRyY])\S*)/\2\t\1/'
May abcMay
maY defmaY
Mar ghiMark
MaY jklMaY443

$ ... | awk -v pat='mM,aA,rRyY' 'BEGIN{n=split(pat,p,",")}
{for(i=1;i<=length($1);i++)
printf "%s",index(p[i],substr($0,i,1));
print "\t" $0}'
| sort

114 maY defmaY
211 Mar ghiMark
213 May abcMay
214 MaY jklMaY443

一切有序,消除虚拟键

... | cut -f3-

defmaY
ghiMark
abcMay
jklMaY443

关于regex - 按字符在字符类中的位置对 grep 匹配项进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36706574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com