Sed搜索2个图案,如果第一个图案不存在,则打印第二个图案

Sed搜索2个图案,如果第一个图案不存在,则打印第二个图案,sed,Sed,我有一个关于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*=

我有一个关于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非常容易。但是这个任务迫使我使用sed。到目前为止,这是我的sed命令:

sed 's/.*\([0-9]*:[0-9]*\(am\|pm\)\).*/\1/' FILE
结果仅显示分钟和上午/下午。每行输入中都有许多时间模式。但我的结果显示了每行的最后一个时间模式。如下所示:

:20pm
:25am
:24pm
:21am
我哪里出错了?

给你:

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

+1非常好的第一个问题,包括样本数据、预期输出、当前输出和。。。。喘息,O.P.试图解决他们自己的问题。嗯,你的头衔似乎与你的描述不符,但见鬼,现在是假日季节。祝你好运,继续发帖!哇,非常感谢。这很有效。我将学习这个命令。再次非常感谢你。你让我开心。:)哈哈,不客气。由于找帽子的原因,我今天的票数不足,但明天我会把你的优秀问题投上一票;-)假设行的第一个“天”总是有一个值(示例中的大小写),并且元素中没有一个数字与该天关联(颜色与示例中的大小写类似)。非常高效的sedHi,直到现在,我仍然不明白这个[^$0-9]*是什么意思。你能给我解释一下吗,那是什么意思?我在别的地方看过,$是在最后一行。现在,我要搜索每行末尾的模式。但是,我失败了。你对学习正则表达式有什么建议吗?Thx.
[^$0-9]
表示不是
$
符号,也不是数字0、1、2、…、9。在
[…]
内部,大多数符号失去了它们的特殊含义,这就是为什么
$
表示文字符号而不是行尾。