我想替换它:
<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
答案 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操作中轻松避免转义此字符(#
此处)。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