Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed,如何用Y替换所有出现的X,但仅在看到Z之后?_Regex_Replace_Sed - Fatal编程技术网

Regex 使用sed,如何用Y替换所有出现的X,但仅在看到Z之后?

Regex 使用sed,如何用Y替换所有出现的X,但仅在看到Z之后?,regex,replace,sed,Regex,Replace,Sed,我试图用pipe |替换所有空格,但仅在seing了两个双引号之后 输入: 02/15/2014 00:00:35 CST 1400130035 192.168.39.60 [15/Feb/2015:04:05:10 +0000] 331184 "POST /Test?param=1 HTTP/1.1" 200 '-' 450/-/351 - - - 34322155 TEST - 输出: 02/15/2014 00:00:35 CST 1400130035 192.168.39.60 [15

我试图用pipe |替换所有空格,但仅在seing了两个双引号之后

输入:

02/15/2014 00:00:35 CST 1400130035 192.168.39.60 [15/Feb/2015:04:05:10 +0000] 331184 "POST /Test?param=1 HTTP/1.1" 200 '-' 450/-/351 - - - 34322155 TEST -
输出:

02/15/2014 00:00:35 CST 1400130035 192.168.39.60 [15/Feb/2015:04:05:10 +0000] 331184 "POST /Test?param=1 HTTP/1.1"|200|'-'|450/-/351|-|-|-|34322155|TEST|-
Thx

使用测试:

sed -e :a -e 's/\(.*".*".*\) /\1|/;ta'
使用保持缓冲区:

sed 'h;s/.*".*"//;s/ /|/g;x;s/\(.*".*"\).*/\1/;G;s/\n//'

这可能适用于GNU sed:

sed -r 's/"/&\n/2;h;y/ /|/;G;s/.*\n(.*)\n(.*)\n.*/\2\1/' file
在第二行后面放一个标记,然后复制该行。用|替换所有空格,然后附加复制的行并根据需要重新生成该行。

只需使用awk:

$ awk 'BEGIN{FS=OFS="\""} {gsub(/ /,"|",$3)} 1' file
02/15/2014 00:00:35 CST 1400130035 192.168.39.60 [15/Feb/2015:04:05:10 +0000] 331184 "POST /Test?param=1 HTTP/1.1"|200|'-'|450/-/351|-|-|-|34322155|TEST|-

为什么特别需要使用sed?sed似乎不支持lookbehind。我能看到的唯一简化是使用.*.*而不是.*.*,由于贪婪匹配,它的工作原理是相同的。根据数据的细节,它可以被认为更好、更差或相同。@ooga:但这也可以匹配一个双引号。想想看,如果有两个以上的双引号,我的解决方案可能会失灵。我想我必须让它们更加防弹……用正则表达式无法使它完美。如果在要用管道替换空格的部分之前有两个双引号字符串,则您的方法也将失败。正如我所说的,这取决于数据格式的细节,以及我们对它的信任程度。它永远不会是防弹的,或者换一种说法,如果我们想让它成为防弹的,我们就不会使用sed,因为它会变得毛茸茸的,无法证明它是正确的!