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