[英]Extract substring using 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
因为其regex引擎不支持非贪婪匹配。
但是,如果您考虑使用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 ... }}}
使用awk
awk '{sub(/[^{]*{/,"{");sub(/}"/,"}")}1' file
{\x22id\x22:\x22 ... }}}
{\x22id\x22:"{\x22 ... }}}
Cut="#CuT#"
sed -n --posix "s/\({\\\\x22.*}\)\"$/${Cut}\1/;s/.*${Cut}//p" sample.txt
我使用变量Cut来更改任何其他“标记”,具体取决于要处理的文本中的内容。 本身不需要杂音,如果您确定Cut的值不在文件中,则可以直接在sed中更改其内容。
这可能对您有用(GNU sed):
sed 's/\({\\x22.*}\).*/\n\1/;s/.*\n//' file
贪婪是第一场比赛的敌人,所以对{\\x22
使用分而治之。 那就是放置一个唯一的标记(在本例中为\\n
),并使用第二个替换命令删除字符串的第一部分。 对于最后一个}
贪婪是您的朋友,因为.*}
会自己找到最后一个匹配项。
注意:如果第一个匹配项是单个字符,则说X
则否定的字符类[^X]*
就足够了。 但是,由于它是一个字符串(两个或多个字符),因此将不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.