尝试用 SED 替换 PHP 中的行

Triying to replace line in PHP with 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

's' 命令的语法是:

s/foo/bar/

但字符串中只有两个未转义的“/”字符。

我建议您使用不同的分隔符重新组合您的替换。 IE。你也可以使用:

s-foo-bar-
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// 行为,其中 // 表示最后研究的正则表达式,以及替换模式中的 &(找到的模式内容)

我认为问题在于您正在转义 "delimiter" (在第一种情况下 /,在第二种情况下 - ),因此 sed 不会将其解释为这应该。尝试用 - 替换中间 \- .

只需使用字符串运算符而不是正则表达式和 "special" 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([=10=],tgt) { [=10=] = substr([=10=],1,s+length(tgt)-1) add substr([=10=],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