没有进一步扩展 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.comsubst foo\@bar.comsubst "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/// 中,不使用 eee 修饰符,替换部分中的变量被视为文字,因此您无需转义它们。