簡體   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