如何按行长度排序,然后按字母顺序反向

Dyc*_*cey 4 regex sorting bash sed

我有一大堆(600多个)搜索和替换术语,我需要在某些文件上作为sed脚本运行.问题是搜索术语不是正交的...但我认为我可以通过按行长度排序来逃避它(即首先拉出最长的匹配,然后在每个长度内按字母顺序排出.所以给出了一组未完成的:

aaba
aa
ab
abba
bab
aba
Run Code Online (Sandbox Code Playgroud)

我想要的是一个排序集,如:

abba
aaba
bab
aba
ab
aa
Run Code Online (Sandbox Code Playgroud)

有没有办法通过预先说明行长度和按字段排序来做到这一点?

奖金标记:-) !!! 搜索和替换实际上只是用_term_替换术语的情况,我将要使用的sed代码是s/term/_term_/g我如何编写正则表达式以避免替换已经在_对中的术语?

mob*_*mob 10

您可以在一行Perl脚本中执行此操作:

perl -e 'print sort { length $b<=>length $a || $b cmp $a } <>' input
Run Code Online (Sandbox Code Playgroud)

  • +1在Perl中,任何可能使用大量shell脚本的任务都可以更轻松,更短,更清晰. (2认同)