Unix 使用正则表达式的Sed

Unix 使用正则表达式的Sed,unix,sed,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' 我想将输出重新格式化为如下所示: 12

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


非常感谢您的帮助。

如果您只需要
-[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'

如果只需要
-[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'
移除最后一个|和[之后的末端]之间的零件


移除位于最后一个|和[后面的末端之外]之间的部分

您可以使用此
sed

sed -r 's/^(([^|]+\|){3}).*(-[^]]+]).*/\1 \3/'
如果您没有
-r
选项

sed 's/^\(\([^|]\+|\)\{3\}\).*\(-[^]]\+]\).*/\1 \3/'
测试:


echo“123 | 2013-12-24 |操作系统版本:Mac OS X 10.9.1 |线程4崩溃:7 com.apple.test.test 0x00000001053fdef3-[GCDAsyncSocketPreBuffer dealloc]+64”| sed-r's/^([^]+\\\\\\\\})。*([^]+])./\1\3/

您可以使用此
sed
<

sed -r 's/^(([^|]+\|){3}).*(-[^]]+]).*/\1 \3/'
如果您没有
-r
选项

sed 's/^\(\([^|]\+|\)\{3\}\).*\(-[^]]\+]\).*/\1 \3/'
测试:

echo“123 | 2013-12-24 |操作系统版本:Mac OS X 10.9.1 |线程4崩溃:7 com.apple.test.test 0x00000001053fdef3-[GCDAsyncSocketPreBuffer dealloc]+64”| sed-r's/^([^]+\\\\\\\\})。*([^]+])./\1\3/

  • sed
    解决方案(OSX用户:将
    -r
    替换为
    -E
    ):
  • in=“123 | 2013-12-24 |操作系统版本:Mac OS X 10.9.1 |线程4崩溃:7 com\
    apple.test.test 0x00000001053fdef3-[GCDAsyncSocketPreBuffer dealloc]+64“
    sed-r的/\\\\\\[^\]+([-+]\[^]]+\]).$/\\\\\1/'
    • sed
      解决方案(OSX用户:将
      -r
      替换为
      -E
      ):
    in=“123 | 2013-12-24 |操作系统版本:Mac OS X 10.9.1 |线程4崩溃:7 com\
    apple.test.test 0x00000001053fdef3-[GCDAsyncSocketPreBuffer dealloc]+64“
    sed-r的/\\\\\\[^\]+([-+]\[^]]+\]).$/\\\\\\1/'这可能适合您(GNU sed):

    这可能适用于您(GNU-sed):


    +1对于
    -r
    版本(OSX用户:使用
    -E
    ),但非
    r
    版本似乎不起作用。+1对于
    -r
    版本(OSX用户:使用
    -E
    ),但非
    r
    版本似乎不起作用。第一个命令起作用(在Linux上;在OSX上你没有
    +
    量词,所以你需要使用
    sed's/*\(\[^]\{1,\}\]./\1/g'
    ),但第二个没有(字符串按原样输出)。第一个命令有效(在Linux上;在OSX上你没有
    +
    量词,所以你需要使用
    sed's/*.[^]\\\\\\\\\\\\\/\\\\\\\\\/\\\\\\\\\\\\\\\\\/\\\\\\\\\\\\\\\\\\\/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,但第二个不起作用(字符串按原样输出)。这似乎不起作用(在Linux上:
    sed:-e expression#1,char 19:s的未知选项
    ).add-posix使用GNU时,GNU使用的是| as OR,而不是像我一样在AIX上使用Reduce RegEx语法的其他版本。即使在添加了
    --posix
    之后,我也会遇到同样的错误:问题是在第二个
    ]/
    命令末尾的第三段,
    /
    ,它会被解释为一个RegEx选项。总的来说,我不清楚您的命令是如何执行的并且应该是有效的:第一个
    s
    命令仅从原始管柱中删除第二个管段,而您想要的是删除第四个管柱中剩下的前3个管段,第四个管柱包含感兴趣的子管柱。我不清楚第二个
    s
    命令试图实现什么;如果我们删除第三个管段,您所做的就是删除第三个管段将一个
    ]
    替换为一个文本
    *
    (至少是
    --posix
    )。错误界面键盘-椅子,我错误地键入了]/*而不是].*在最后的s/,很抱歉这似乎不起作用(在Linux上:
    sed:-e表达式#1,char 19:s的未知选项
    ).add-posix使用GNU时,GNU使用的是| as OR,而不是像我一样在AIX上使用Reduce RegEx语法的其他版本。即使在添加了
    --posix
    之后,我也会遇到同样的错误:问题是在第二个
    ]/
    命令末尾的第三段,
    /
    ,它会被解释为一个RegEx选项。总的来说,我不清楚您的命令是如何执行的并且应该是有效的:第一个
    s
    命令仅从原始管柱中删除第二个管段,而您想要的是删除第四个管柱中剩下的前3个管段,第四个管柱包含感兴趣的子管柱。我不清楚第二个
    s
    命令试图实现什么;如果我们删除第三个管段,您所做的就是删除第三个管段将一个
    ]
    替换为一个文本
    *
    (至少替换为
    --posix
    )。错误界面键盘-椅子,我错误地键入了]/*而不是].*在最后的s/,对不起