试图用SED替换PHP中的行

时间:2015-04-20 12:50:22

标签: php linux sed

我想替换它:

<li><a href="autor.php?<?=$a?>">Autor</a></li>

为:

<li><a href="autor.php?<?=$a?>">Autor</a></li><li><a href="QTY.php?<?=$a?>">QTY</a></li>

使用此代码:

find www/ -type f -exec sed -i 's/\"\<li\>\<a href=\"autor.php\?\<\?\=\$a?\>\"\>Autor\<\/a\>\<\/li\>\"\/\"\<li\>\<a href=\"autor.php\?\<\?=\$a\?>\">Autor\<\/a\>\<\/li\>\<li\>\<a href=\"QTY.php\?\<\?=\$a\?\>\"\>QTY\<\/a\>\<\/li\>\"/g' {} \;

我得到了这个错误:

sed: -e expression #1, char 211: unterminated `s' command

4 个答案:

答案 0 :(得分:2)

我认为问题在于您正在逃避“分隔符”(在第一种情况下/,在第二种情况下-),因此sed不会按原样解释它。尝试将中间\-替换为-

答案 1 :(得分:0)

's'命令的语法是:

s/foo/bar/

但是字符串中只有两个'/'字符没有被转义。

我建议您使用其他分隔符重新组合替换。即你也可以使用:

s-foo-bar-

答案 2 :(得分:0)

find www/ -type f -exec \
  sed -i '\#<li><a href="autor.php?<?=\$a?>">Autor</a></li># { 
             s##&<li><a href="QTY.php?<?=\$a?>">QTY</a></li>#
             }' {} \;
  • 可以通过在sed操作和{}中移除\来实现单线程。将其用于清晰度
  • 使用除/之外的另一个分隔符,以便在sed操作中轻松避免转义此字符(#此处)。
  • s///操作之前使用模式匹配,但也可以直接进行(也为了清晰起见)。我使用s//行为,其中//表示,最后一个正则表达式研究,以及替换模式中的&(找到模式内容)

答案 3 :(得分:0)

只需使用字符串运算符而不是正则表达式和“特殊”sed替换模式:

$ cat file
foo<li><a href="autor.php?<?=$a?>">Autor</a></li>bar

$ awk -v tgt='<li><a href="autor.php?<?=$a?>">Autor</a></li>' \
      -v add='<li><a href="QTY.php?<?=$a?>">QTY</a></li>' '
           s=index($0,tgt) { $0 = substr($0,1,s+length(tgt)-1) add substr($0,s+length(tgt)) }
    1' file
foo<li><a href="autor.php?<?=$a?>">Autor</a></li><li><a href="QTY.php?<?=$a?>">QTY</a></li>bar