我有一个包含以下内容的日志文件:
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/