我想从以下命令的输出中提取子字符串 - [GCDAsyncSocketPreBuffer dealloc] :
echo "123 | 2013-12-24 | OS Version: Mac OS X 10.9.1 | Thread 4 Crashed: 7 com.apple.test.test 0x00000001053fdef3 -[GCDAsyncSocketPreBuffer dealloc] + 64" | sed 's/\[.*\]/\1\p'
我想将输出重新格式化为:
123 | 2013-12-24 |操作系统版本:Mac OS X 10.9.1 | - [GCDAsyncSocketPreBuffer dealloc]
任何帮助都将非常感激。
答案 0 :(得分:1)
如果只想要-[GCDAsyncSocketPreBuffer dealloc]
,请使用此sed命令:
sed 's/.*\(-\[[^]]\+\]\).*/\1/g'
如果你想要
123 | 2013-12-24 | OS Version: Mac OS X 10.9.1 | -[GCDAsyncSocketPreBuffer dealloc]
然后这可能适合你:
sed 's/\(.*-\[[^]]\+\]\).*/\1/g'
答案 1 :(得分:1)
您可以使用此sed
,
sed -r 's/^(([^|]+\|){3}).*(-[^]]+]).*/\1 \3/'
如果您没有-r
选项,
sed 's/^\(\([^|]\+|\)\{3\}\).*\(-[^]]\+]\).*/\1 \3/'
<强>测试强>
echo "123 | 2013-12-24 | OS Version: Mac OS X 10.9.1 | Thread 4 Crashed: 7 com.apple.test.test 0x00000001053fdef3 -[GCDAsyncSocketPreBuffer dealloc] + 64" | sed -r 's/^(([^|]+\|){3}).*(-[^]]+]).*/\1 \3/
“
答案 2 :(得分:1)
sed
解决方案(OSX用户:将-r
替换为-E
):in="123 | 2013-12-24 | OS Version: Mac OS X 10.9.1 | Thread 4 Crashed: 7 com.\
apple.test.test 0x00000001053fdef3 -[GCDAsyncSocketPreBuffer dealloc] + 64"
sed -r 's/\|[^|]+([-+]\[[^]]+\]).*$/\| \1/' <<<"$in"
请注意,此表达式还将正确检测'+[...]'
子字符串。
awk
解决方案:awk -F '[|]|-\\[|]' '{ print $1 "|" $2 "|" $3 "| -[" $5 "]" }' <<<"$in"
gawk
,则可以通过gensub()
提供更灵活的解决方案 - 与sed
解决方案一样,以下内容也会匹配'+[...]'
子字符串。gawk '{ print gensub("[|][^|]+([-+]\\[[^]]+\\]).*$", "| \\1", "1") }' <<<"$in"
答案 3 :(得分:1)
这可能适合你(GNU sed):
sed 's/\(.*|\).*\(-.*]\).*/\1\2/' file
答案 4 :(得分:0)
sed 's/|[^[|]*//;s/]/*/]/'
删除最后一个|之间的部分和[比结束后]