我正在用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
命令,因此它将删除发现的匹配项,使您在第一次时间戳出现之前使用子字符串。