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

使用する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 を使用して、テキストの内容に応じて他の「マーカー」を変更します。variale 自体は必要ありません。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 に答える