Sed:从行中提取正则表达式

时间:2016-11-07 18:15:03

标签: linux unix sed

我有许多行的输入流,如下所示:

path/to/file:             example: 'extract_me.proto'
path/to/other-file:             example: 'me_too.proto'
path/to/something/else:             example: 'and_me_2.proto'
...

我想从这些行中提取*.proto文件名,我尝试过:

[INPUT] | sed 's/^.*\([a-zA-Z0-9_]+\.proto\).*$/\1/'

我知道我的问题的一部分是.*贪婪,我会得到像e.protoo.proto以及2.proto这样的内容,但我甚至不能那么远......它只是输出与输入相同的行。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:2)

我发现为此目的使用扩展正则表达式很有帮助(-r),在这种情况下你不必转义括号。

sed -r 's/^.*[^a-zA-Z0-9_]([a-zA-Z0-9_]+\.proto).*$/\1/'

[^a-zA-Z0-9_]的加法迫使.*不贪婪。

答案 1 :(得分:2)

由于您使用标记命令,我假设您拥有GNU grep。选择其中一个

grep -oP '\w+\.proto' file
grep -o "[^']+\\.proto" file

答案 2 :(得分:1)

一种方法:

sed 's/^.*[^a-zA-Z0-9_]\([a-zA-Z0-9_]\+\.proto\).*$/\1/'
  • 转义了+ char
  • 在alphanum +下划线之前加上一个否定来划分领先的字符

另一种方式:使用单引号分隔,毕竟它就在这里:

sed "s/^.*'\([a-zA-Z0-9_]\+\.proto\)'.*\$/\1/" 

答案 3 :(得分:1)

使用此sed

sed "s/^.*'\([a-zA-Z0-9_]\+\.proto\).*$/\1/"

+ - Extended-RegEx。所以,你需要逃避才能获得特殊的意义。 The preceding item will be matched one or more times.

另一种方式:

sed "s/^.*'\([^']\+\.proto\)'.*$/\1/"

答案 4 :(得分:1)

使用GNU sed:

sed -E "s/.*'([^']+)'$/\1/"