没有进一步扩展 shell 变量的 Perl 单行替换?
Perl one-liner substitution without further expansion of a shell variable?
我有一个脚本可以替换各种文件中的特定电子邮件地址。替换地址是脚本的第一个参数:
#!/bin/bash
perl -pi -e s/'name\@domain\.org'// file-list
这不起作用,因为 </code> 中的 <code>@
字符被 perl 替换了。对此有直接的解决方法吗? 运行 subst foo\@bar.com
、subst foo\@bar.com
、subst "foo@bar.com"
等脚本不起作用。有没有可以更轻松地处理这个问题的 sed 脚本?
这可行,但需要您将新邮件地址传递给脚本,并在 @
字符前加上 \
:
#!/bin/bash
perl -pi -e "s/name\@domain.org//" file-list
如果脚本是subst
,运行为:
subst newname\@example.com
这是一个更好的选择,它使用 sed
进行转义:
#!/bin/bash
ADR="$(echo "" | sed -e 's/@/\\@/')"
perl -pi -e "s/name\@domain.org/$ADR/" file-list
当然,在这种情况下,使用 sed
来完成整个事情可能会更好。
您可以通过设置 s
开关将其作为参数传递,而不是直接在 perl 代码中扩展 shell 变量:
#!/usr/bin/env bash
perl -i -spe 's/name\@domain\.org/$replacement/' -- -replacement="" file1.txt file2.txt
在 perl 的 s///
中,不使用 e
或 ee
修饰符,替换部分中的变量被视为文字,因此您无需转义它们。
我有一个脚本可以替换各种文件中的特定电子邮件地址。替换地址是脚本的第一个参数:
#!/bin/bash
perl -pi -e s/'name\@domain\.org'// file-list
这不起作用,因为 </code> 中的 <code>@
字符被 perl 替换了。对此有直接的解决方法吗? 运行 subst foo\@bar.com
、subst foo\@bar.com
、subst "foo@bar.com"
等脚本不起作用。有没有可以更轻松地处理这个问题的 sed 脚本?
这可行,但需要您将新邮件地址传递给脚本,并在 @
字符前加上 \
:
#!/bin/bash
perl -pi -e "s/name\@domain.org//" file-list
如果脚本是subst
,运行为:
subst newname\@example.com
这是一个更好的选择,它使用 sed
进行转义:
#!/bin/bash
ADR="$(echo "" | sed -e 's/@/\\@/')"
perl -pi -e "s/name\@domain.org/$ADR/" file-list
当然,在这种情况下,使用 sed
来完成整个事情可能会更好。
您可以通过设置 s
开关将其作为参数传递,而不是直接在 perl 代码中扩展 shell 变量:
#!/usr/bin/env bash
perl -i -spe 's/name\@domain\.org/$replacement/' -- -replacement="" file1.txt file2.txt
在 perl 的 s///
中,不使用 e
或 ee
修饰符,替换部分中的变量被视为文字,因此您无需转义它们。