sed 模式匹配直到第一次匹配

sed pattern match until first match only

我正在与 sed 正则表达式作斗争。 我查看了有关该主题的旧线程,但无法找到解决方案,我想避免使用 awk 命令。

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

案例 1:

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

案例二:

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

预期输出:abc_123_def

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

谢谢!

您可以匹配 _ 之后的第一个时间戳,然后匹配所有到行尾以删除匹配:

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

online demo

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