我有一个文件,其中的每一行都可以用这个语法来描述:
<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轻松完成。希望使用一些内置工具,如sed
、awk
、...
或者使用正则表达式替换
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 '(?<=: ).*?(?=,)'
如果行中有后续逗号,则可能会找到多个子字符串。