我有许多行的输入流,如下所示:
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.proto
和o.proto
以及2.proto
这样的内容,但我甚至不能那么远......它只是输出与输入相同的行。任何帮助将不胜感激。
答案 0 :(得分:2)
我发现为此目的使用扩展正则表达式很有帮助(-r
),在这种情况下你不必转义括号。
sed -r 's/^.*[^a-zA-Z0-9_]([a-zA-Z0-9_]+\.proto).*$/\1/'
[^a-zA-Z0-9_]
的加法迫使.*
不贪婪。
答案 1 :(得分:2)
由于您使用linux标记命令,我假设您拥有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 另一种方式:使用单引号分隔,毕竟它就在这里:
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/"