使用`grep`,`awk`,`sed`或其他任何能力进行简单过滤

时间:2012-09-26 17:34:21

标签: parsing sed awk grep

我有一个文件,每一行都可以用这个语法来描述:

<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 },...)

4 个答案:

答案 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 '(?<=: ).*?(?=,)'

如果行中有后续逗号,则可能会找到多个子字符串。