我正在努力使用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表达式也在捕获第一个时间戳。我知道.*
会尽可能匹配,但是我该如何解决?
谢谢!
答案 0 :(得分:2)
您可以匹配_
之后的第一个时间戳,然后将全部匹配到行尾以删除匹配项:
sed 's/_[0-9]\{8\}.*//' <<< "$input_str"
请参见online demo
这样,您可以利用正则表达式引擎从左到右搜索字符串的事实,而_[0-9]\{8\}
将匹配时间戳从左开始的 first 出现< / em>,则.*
将与该行的其余部分匹配,并且由于它是s
命令,它将删除找到的匹配项,并在第一次出现TIMESTAMP之前将子字符串留给您。>