Sed使用正则表达式

时间:2014-01-28 13:22:01

标签: unix sed

我想从以下命令的输出中提取子字符串 - [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]

任何帮助都将非常感激。

5 个答案:

答案 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/]/*/]/'

删除最后一个|之间的部分和[比结束后]