2

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

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

4

4 回答 4

2

或使用正则表达式替换

sed -n 's/^[^:]*:\([^:,]*\),.*/\1/p' file

Linuxsed方言;如果在不同的平台上,也许您需要一个-E选项和/或去掉圆括号前的反斜杠;或者直接使用 Perl;

perl -nle 'print $1 if m/:(.*?),/' file
于 2012-09-26T18:10:50.480 回答
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 Expansionbash下的手册页上阅读相关内容。

于 2012-09-26T18:35:41.387 回答
1

使用 GNU grep:

grep -oP '(?<=: ).*?(?=,)'

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

于 2012-09-26T20:16:23.613 回答
1

假设输入将类似于您上面的内容:

awk '{print $4}' | tr -d ,

对于整个文件,您只需在awk命令旁边键入我上面的命令的文件名。

于 2012-09-26T17:37:58.563 回答