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



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

<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 ...>

如何获得位于第一个<colon>和第一个<comma>之间的<fullpath>部分

(我不太倾向于编写一个程序来解析它,尽管这看起来可以用javacc轻松完成。希望使用一些内置工具,如sedawk、...

或者使用正则表达式替换

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

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

perl -nle 'print $1 if m/:(.*?),/' file

假设输入与上面的输入类似:

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

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

如果你使用 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

有关此内容,请参阅bash手册页的"参数扩展"下的内容。

与 GNU grep:

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

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

最新更新