我有以下日志文​​件:

example.com - - - 127.0.01 [22/Sep/2013:07:22:22 +0000]  "POST /api/test.php HTTP/1.1" 200 355 "-" "-" "{\x22id\x22:\x22 ... }}}"

example.com - - - 127.0.01 [22/Sep/2013:07:22:22 +0000]  "POST /api/test.php HTTP/1.1" 200 355 "-" "-" "{\x22id\x22:"{\x22 ... }}}"


我想将第一个{\x22提取到最后一个}

所以我正在使用以下sed命令:

cat test.txt  | sed -r  's/.+?"(\{.+\})".*/\1/g'


但是,它给了我

{\x22id\x22:\x22 ... }}}

{\x22 ... }}}


但是我想要

{\x22id\x22:\x22 ... }}}

{\x22id\x22:"{\x22 ... }}}

最佳答案

.+?不能与sed一起使用,因为其正则表达式引擎不支持非贪婪匹配。

但是,如果您考虑使用perl,则可以:

perl -pe 's/.+?"(\{.+\})".*/\1/g' test.txt
{\x22id\x22:\x22 ... }}}
{\x22id\x22:"{\x22 ... }}}


或使用egrep -o

egrep -o '\{.+\}' test.txt
{\x22id\x22:\x22 ... }}}
{\x22id\x22:"{\x22 ... }}}

关于regex - 使用sed提取子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19971628/

10-11 12:08