【问题标题】:linux pipe with egrep not working as expected带有 egrep 的 linux 管道无法按预期工作
【发布时间】:2014-03-27 18:01:52
【问题描述】:

我有一小段代码

 egrep -oh '([A-Z]+)_([A-Z]+)_([A-Z]+)' -R /path | uniq | sort

当我不想显示任何重复项时,我使用此脚本挖掘存储在公共目录中的文件中的环境变量,但我只想要任何变量的名称(如果有的话)。

不用说正则表达式有效,匹配的单词是由 ​​3 个大写字母 *_*_* 的子集组成的单词,问题是 uniq 看起来不像它的工作和做任何事情,变量会在egrep 找到它们时打印出来。

即使uniq -u 也不能解决问题。

管道本身有问题吗?

【问题讨论】:

  • 你的sortuniq的顺序颠倒了。
  • 顺序颠倒了。 ... | sort | uniq
  • 先排序,再uniq
  • @BroSlow 为什么? uniq 不缓存结果?
  • @user2485710 不是缓存结果,uniq 会检查相邻的值,所以需要先排序。

标签: regex linux bash pipe sh


【解决方案1】:

如果您希望它以这种方式工作,uniq 需要对其输入进行排序。来自man page(强调我的)

描述:过滤相邻匹配行

所以你可以在管道中的uniq 之前放置一个sort,但这不是必需的,你可以简单地使用-u 标志到sort 只输出排序输出中的唯一行:

egrep -oh '([A-Z]+)_([A-Z]+)_([A-Z]+)' -R /path | sort -u

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多