尝试用 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
我想替换这个:
<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