sed模式匹配,直到仅第一个匹配

时间:2018-12-17 09:58:46

标签: linux unix sed pattern-matching ksh

我正在努力使用sed正则表达式。 我查看了与此主题相关的较旧的现有主题,但无法找到解决方案,因此我想避免使用awk命令。

我想要捕获输入字符串中第一个时间戳之前的部分。

情况1:

$ input_str=abc_123_def_20181217T2345
$ echo $input_str | sed 's/\(.*\)_\([0-9]\{8\}\).*/\1/'
$ abc_123_def

情况2:

$ input_str=abc_123_def_20181217T2345_20181218T2345
$ echo $input_str | sed 's/\(.*\)_\([0-9]\{8\}\).*/\1/'
$ abc_123_def_20181217T2345

预期输出:abc_123_def

从案例2中可以看出,sed表达式也在捕获第一个时间戳。我知道.*会尽可能匹配,但是我该如何解决?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以匹配_之后的第一个时间戳,然后将全部匹配到行尾以删除匹配项:

sed 's/_[0-9]\{8\}.*//' <<< "$input_str"

请参见online demo

这样,您可以利用正则表达式引擎从左到右搜索字符串的事实,而_[0-9]\{8\}将匹配时间戳从左开始的 first 出现< / em>,则.*将与该行的其余部分匹配,并且由于它是s命令,它将删除找到的匹配项,并在第一次出现TIMESTAMP之前将子字符串留给您。