gpt4 book ai didi

regex - sed/perl 带有特殊字符 (@)

转载 作者:行者123 更新时间:2023-12-02 13:49:17 25 4
gpt4 key购买 nike

我想在这一行上使用 sed/perl:

perl -pi -e  "s/password/p@ssw0rd/g" <file_name>

如何让 sed/perl 忽略特殊字符,我尝试在特殊字符之前添加反斜杠,但也许我弄错了,有人可以给我举个例子吗?

最佳答案

@ 仅对 Perl 来说是特殊的,而不是 sed,因此在这种情况下您可以简单地使用 sed:

sed -i -e 's/password/p@ssw0rd/g' filename     # GNU sed
sed -i '' -e 's/password/p@ssw0rd/g' filename # BSD sed

在从 shell 向命令传递代码时,您应该养成使用单引号的习惯,因为这样在命令看到代码之前,shell 不会修改任何代码。如果你这样做,那么反斜杠 at 符号将适用于 Perl:

perl -pi -e  's/password/p\@ssw0rd/g' filename

您还可以在替换表达式中使用单引号作为分隔符,这会导致所包含的表达式按字面解释而不进行扩展;如果您在 shell 中返回双引号,那就更容易了:

perl -pi -e "s'password'p@ssw0rd'g" filename

但是如果你可能需要担心那里的 shell 扩展,你需要用单引号引用 shell 中的代码字符串 使用单引号作为分隔符,这很尴尬你可能最好在 at 符号上使用反斜杠:

perl -pi -e  's'\''password'\''p@ssw0rd'\''g' filename # POSIX shell
perl -pi -e $'s\'password\'p@ssw0rd\'g' filename # bash/ksh/zsh ANSI string

要回答评论中的问题,如果您想让旧字符串和新字符串动态参数作为envariables传递,它们将是 $ENV{varname} 而不仅仅是 $varname 在 Perl 中,你必须以不同的方式对待它们。您不再需要担心替换值的插值(因为您只想要它的一层),但您必须担心模式侧的特殊正则表达式字符,这意味着您需要放置 \Q...\E 围绕您要查找的内容:

CURRENTVALUE=password NEWVALUE=p@ssw0rd perl -pi -e 's/\Q$ENV{CURRENTVALUE}\E/$ENV{NEWVALUE}/g' filename

...也就是说,除非您希望 $CURRENTVALUE 的值能够是正则表达式而不仅仅是文字字符串。但你必须选择一个。

关于regex - sed/perl 带有特殊字符 (@),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50610524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com