Parsing 使用'grep'、'awk'、'sed'或任何其他';他能干

Parsing 使用'grep'、'awk'、'sed'或任何其他';他能干,parsing,sed,awk,grep,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 progr

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

<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 ...>
需要修复(星期日):src/foo/io.c,作者:史密斯:正在进行中:
如何获取位于第一个
和第一个
之间的
部分


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

假设输入与上面的类似:

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

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

或使用正则表达式替换即可

sed -n 's/^[^:]*:\([^:,]*\),.*/\1/p' file
Linux
sed
方言;如果在不同的平台上,可能需要一个
-E
选项和/或在圆括号前去掉反斜杠;或者干脆改用Perl

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

如果您使用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
$text=“需要修复(星期日):src/foo/io.c,作者:Smith:进行中:”
$text=${text%%,*}
$text=${text#*:}
$echo“$text”
src/foo/io.c
在GNU grep下的
bash
手册页上阅读此内容:

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

grep-oP'(?不会
awk'{print$3}'日志| tr-d,
cat log{print$3}更好)“| tr-d m
?但非常感谢!!!@user1508893是的,你也可以这样做。我不确定所有输入是否都相同。我想你可以根据需要定制该命令。这太脆弱了;如果冒号前的文本可以是自由格式的,只要它不包含冒号,
$4
将是Majoritt中的错误索引当然,这是可以修复的,但方法必须不同。我将使用
awk-F:'{sub(/,.*/,'',$2);print$2}“
如果您真的想使用awk。虽然我认为对于问题中描述的语法,正则表达式或模式匹配就足够了。@tripleee我同意,这有点简单。我的答案除了静态格式之外没有太多解释。