繁体   English   中英

使用sed提取子字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM