【问题标题】:Get first set of 8 numbers only with Sed仅使用 Sed 获取第一组 8 个数字
【发布时间】:2017-04-24 11:04:12
【问题描述】:

我有一些用于 Windows 和 SED 的代码给我一个文件名中的第一组八个字符,它一直给我第二组,只是我无法弄清楚我做错了什么。

我的代码:

echo JiggySauce_20161208_21325005_Meat.txt | sed -r "s/.*_([0-9]*)_.*/\1/g"

加法示例(因此每个下划线分隔符的正则表达式并不总是有效)

echo JiggySauce_Mustard_Mayo_20161208_21325005_Meat.txt | sed -r "s/.*_([0-9]*)_.*/\1/g"

我不断得到这个错误的结果(至少不是我需要的):

21325005

我的预期结果:

20161208

我什至可以和一起生活(最好不要,但我想可以一起工作)

20161208_21325005

如果你有答案,请帮我解决这个问题,因为我正处于静止状态,看起来很愚蠢,像 UHHH 一样被困在这里......

【问题讨论】:

  • 可能与 sed 模式匹配贪婪有关。看看stackoverflow.com/questions/1103149/…
  • 我看到您对sed 解决方案特别感兴趣,但grep -o 可能会做得很好。
  • @MichaelVehrs 为 Grep 添加一个答案,如果你有一个可行的答案,我也可以使用 Grep。

标签: regex parsing sed


【解决方案1】:

使用 GNU sed:

echo JiggySauce_20161208_21325005_Meat.txt | sed -r 's/^[^_]*_([^_]*).*/\1/'

输出:

20161208

发布初始答案更新:

我建议:sed -r 's/[^0-9]*([0-9]{8}).*/\1/' Cyrus

输出:

20161208

见:The Stack Overflow Regular Expressions FAQ

【讨论】:

  • 这适用于我的一个示例,但我忘了提到文件名可能有其他名称部分和额外的下划线,但例如我也有 JiggySauce_Mustard_Mayo_20161208_21325005_Meat.txt ,这是行不通的。不管怎样,我都会给你加一个,但会用我缺少的这个细节来更新我的问题。如果您有一个,我仍然期待您的工作答复...如果您愿意,我会很乐意接受...无论如何,非常感谢。
  • 我建议:sed -r 's/[^0-9]*([0-9]{8}).*/\1/'
  • 这就是我需要的...谢谢...请在有机会时更新您的答案...这是我需要的答案。一旦您更新答案以包含该语法,我将密切关注它并接受。
【解决方案2】:

使用grep

echo JiggySauce_20161208_21325005_Meat.txt | grep -Eo '[0-9]+' | head -1

echo JiggySauce_20161208_21325005_Meat.txt | tr '_' '\n' | grep -m1 -Eo '[0-9]+'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 2022-10-21
    • 2020-12-04
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多