0

我有以下日志文​​件:

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 ... }}}
4

4 回答 4

0

这可能对您有用(GNU sed):

sed 's/\({\\x22.*}\).*/\n\1/;s/.*\n//' file

贪婪是您在第一场比赛中的敌人,因此请使用分而治之的成语{\x22。那就是放置一个唯一的标记(在这种情况下\n)并使用第二个替换命令来删除字符串的第一部分。因为最后的}贪婪是你的朋友,因为它.*}会自己找到最后一场比赛。

注意如果第一个匹配是单个字符,X那么一个否定字符类[^X]*就足够了。但是,因为它是一个字符串(两个或更多字符),所以这不起作用。

于 2013-11-14T08:59:25.487 回答
0

使用awk

awk '{sub(/[^{]*{/,"{");sub(/}"/,"}")}1' file
{\x22id\x22:\x22 ... }}}

{\x22id\x22:"{\x22 ... }}}
于 2013-11-14T07:28:02.353 回答
0
Cut="#CuT#"
sed -n --posix "s/\({\\\\x22.*}\)\"$/${Cut}\1/;s/.*${Cut}//p" sample.txt

我使用变量 Cut 来更改任何其他“标记”,具体取决于要处理的文本内容。变量本身不需要,如果您确定 Cut 的值不在文件中,您可以直接在 sed 中更改其内容

于 2013-11-14T07:44:06.023 回答
0

Well.+?不适用,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 ... }}}
于 2013-11-14T07:12:57.323 回答