regex - 使用 sed 提取子字符串

标签 regex linux sed

我有一个包含以下内容的日志文件:

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/

相关文章:

java - 如何获取与这些字符串匹配的正则表达式

不包含Y但包含X的SQL选择字符串

linux - 奇怪的管道故障案例

linux - 使用 shell 脚本用文件中的斜杠替换行

SWTOR 名称的正则表达式

linux - 期望脚本无法使用 ssh 从文件获取输入

linux - 动态间接 Bash 数组

linux - 如何在第 n 行文件的中间插入文本

python - 如何在 python 中搜索一系列行?

python - 正则表达式在 python 中不起作用