使用Sed

时间:2018-11-02 10:42:26

标签: regex sed

我有如下访问日志:

10.2.21.120 - - [26/Jan/2013:19:15:11 +0000] "GET /index.html HTTP/1.1" 200 6 "-" "Mozilla/0.0 (X11; Linux x86_64) AppleWebKit/000.00 (KHTML, like Gecko) Chrome/0.0.0000.00 Safari/000.00"

我要替换用户代理。结果:

10.2.21.120 - - [26/Jan/2013:19:15:11 +0000] "GET /index.html HTTP/1.1" 200 6 "-" "NetScape"

我尝试在"-"之后进行所有更改,但Sed跳过""并在-之后进行所有更改

类似sed 's/[(][^)]*[)]/\(NetScape\)/g'输入的内容只能在方括号中更改用户代理

1 个答案:

答案 0 :(得分:0)

使用sed,您可以在行尾替换引号之间的子字符串:

sed 's/"[^"]*"$/"NetScape"/'

在这里,"[^"]*"$匹配",然后是0+个除"以外的字符,然后是行末的"。您不需要g运算符,因为sed逐行处理文件。

请参见online sed demo

log='10.2.21.120 - - [26/Jan/2013:19:15:11 +0000] "GET /index.html HTTP/1.1" 200 6 "-" "Mozilla/0.0 (X11; Linux x86_64) AppleWebKit/000.00 (KHTML, like Gecko) Chrome/0.0.0000.00 Safari/000.00"'
sed 's/"[^"]*"$/"NetScape"/' <<< "$log"
# => 10.2.21.120 - - [26/Jan/2013:19:15:11 +0000] "GET /index.html HTTP/1.1" 200 6 "-" "NetScape"