我有一个文件,每一行都可以用这个语法来描述:
<text> <colon> <fullpath> <comma> <"by"> <text> <colon> <text> <colon> <text> <colon> <text>
例如,
needs fixing (Sunday): src/foo/io.c, by Smith : in progress : <... random comment ...>
如何获取位于第一个<fullpath>
和第一个<colon>
<comma>
部分
(我不太愿意编写一个程序来解析它,虽然看起来这可以通过javacc轻松完成。希望使用一些内置工具,如sed
,{{1 },...)
答案 0 :(得分:2)
或使用正则表达式替换
sed -n 's/^[^:]*:\([^:,]*\),.*/\1/p' file
Linux sed
方言;如果在不同的平台上,也许你需要一个-E
选项和/或在圆括号前取出反斜杠;或者只是改用Perl;
perl -nle 'print $1 if m/:(.*?),/' file
答案 1 :(得分:1)
假设输入与上面的输入类似:
awk '{print $4}' | tr -d ,
对于整个文件,您只需在awk
命令旁边输入我上面命令的文件名。
答案 2 :(得分:1)
如果你使用bash脚本来解析这些东西,你甚至不需要像awk或sed这样的工具。
$ text="needs fixing (Sunday): src/foo/io.c, by Smith : in progress : <... comment ...>"
$ text=${text%%,*}
$ text=${text#*: }
$ echo "$text"
src/foo/io.c
在Parameter Expansion下的bash
手册页上阅读此内容。
答案 3 :(得分:1)
使用GNU grep:
grep -oP '(?<=: ).*?(?=,)'
如果行中有后续逗号,则可能会找到多个子字符串。