【问题标题】:Sed to Search 2 patterns, if the first pattern not exist, print the second patternsed 搜索 2 个模式,如果第一个模式不存在,则打印第二个模式
【发布时间】:2013-12-17 20:34:14
【问题描述】:

我有一个关于 sed 的问题。从这个输入:

[/=TueGreen$58.30Orange5:36pmSat*=WedOrange$76.63Purple6:20pmTue]
[/=Thu6:06pm$09.05Blue11:32amMon/=Thu1:38am$56.41Red4:25amThu]
[/=Sun1:49pm$12.41Yellow2:51pmMon*=FriOrange$49.68Blue1:24pmTue]
[/=Sat11:58am$82.24Orange3:44amMon*=Thu1:08am$33.49Red8:21amSat]

我必须做一个输出:

$58.30
6:06pm$09.05
1:49pm$12.41
11:58am$82.24

我知道,模式看起来很简单,但是,我什至没能找到时间模式。因为小时有时是 1 或 2 位数字。

这是我学习 sed 并寻找答案的第三天。我学过grep。如果使用 grep,那么简单。但是这个任务迫使我使用 sed。到目前为止,这是我的 sed 命令:

sed 's/.*\([0-9]*:[0-9]*\(am\|pm\)\).*/\1/' FILE

结果仅显示分钟和上午/下午。输入的每一行都有很多时间模式。但我的结果显示了每行中的最后一次模式。如下所示:

:20pm
:25am
:24pm
:21am

我哪里做错了?

【问题讨论】:

  • +1 表示非常好的第一个问题,包括样本数据、预期输出、当前输出和 ....gasp,O.P. 尝试解决自己的问题。嗯,你的标题似乎与你的描述不符,但到底是什么,它是假期。祝你好运,继续发帖!

标签: sed


【解决方案1】:

给你:

sed -e 's/[^$0-9]*\([0-9:]*[ap]m\)*\(\$[0-9.]*\).*/\1\2/'

【讨论】:

  • 哇,非常感谢。这行得通。我将学习这个命令。再次非常感谢您。你让我开心。 :)
  • 哈哈,不客气。由于帽子狩猎,我今天没有投票,但明天我会支持你的好问题;-)
  • 假设该行的第一个“天”总是有一个值(示例中的情况),并且元素中的数字永远不会与日期相关联(示例中的颜色就是这种情况)。非常高效的 sed
  • 嗨,直到现在,我还是不明白这个 [^$0-9]* 是什么意思。你给我解释一下,这是什么意思?我在其他地方看 $ 是看行尾。现在,我必须搜索每行末尾的模式。但是,我失败了。你有什么学习正则表达式的推荐吗?谢谢。
  • [^$0-9] 表示不是$ 符号,也不是数字0、1、2、...、9。在[...] 内部,大多数符号都失去了它们的特殊含义,这就是$ 存在的原因表示文字 $ 符号而不是行尾。
猜你喜欢
  • 2016-11-03
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多