SED图案匹配直到第一次比赛



我正在用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表达式也捕获了第一个时间戳。我了解.*将尽可能匹配,但是我该如何解决?

谢谢!

您可以匹配_之后的第一个时间戳,然后将所有内容匹配到行的末端以删除比赛:

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

请参阅在线演示

这样,您将利用以下事实:正则发动机从左到右搜索字符串,并且_[0-9]{8}将从左中匹配 first 出现时间戳.*将与该行的其余部分匹配,并且由于它是s命令,因此它将删除发现的匹配项,使您在第一次时间戳出现之前使用子字符串。

最新更新