【发布时间】:2016-04-19 11:13:05
【问题描述】:
我正在尝试使用 grep 来实现以下目标:
鉴于[mM][aA][rRyY]$、abcMAy、defmAy、ghimaR 等 grep 模式都匹配该模式,我想按字符在字符类中的位置对它们进行排序。例如,由于m 在[mM] 中出现在M 之前,我希望MAy 出现在最后;同样,由于a 出现在[aA] 中的A 之前,我希望maR 出现在mAy 之前。
这绝对不是典型的用法,但我想知道它是否可以轻松完成?
【问题讨论】:
-
我会使用
awk来输出带有匹配字符位置前缀的行。然后按该列排序。 -
SO 不是免费的编码服务。如果你在
bash做复杂的事情,你真的需要学习awk。 -
正则表达式告诉你字符串匹配后,你需要单步遍历字符串的匹配部分。对于每个字符,您需要使用 PHP 中的
strpos()等普通字符串搜索函数来找到它在相应字符类中的位置。 -
如果您可以从一些对程序更友好的源构建您的正则表达式,这将有所帮助,但基本上我认为您需要按照 Barmar 的建议对您的列表进行后处理。使用自定义排序功能,您可能会更聪明,并按位置对单个字母应用权重,然后让排序功能完成繁重的工作,但我不确定这会更好。
-
或者您可以让
awk找到字符串的匹配部分及其原始行号,然后使用相同的 awk 脚本解析 RegEx 规则并按匹配的索引对字符串进行排序人物。我推荐 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书,但与此同时,请发布一些简洁、可测试的示例输入和预期输出,我们可以为您提供帮助。