如何在不使用 sed 的情况下从命令行替换 (PHP) 文件中的电子邮件?

如何在不使用 sed 的情况下从命令行替换 (PHP) 文件中的电子邮件?

我有一个 PHP 文件,其中包含一个电子邮件地址$to = "example-1_2@example-1_2.com";,我想直接从终端将该电子邮件地址替换为另一个地址。

以下代码基于Kuslanada 的另一个类似代码工作:

read new_email_address
sed -i 's/$to = ".*";$/$to = "'"$new_email_address"'";/' FILE

库斯兰南达在评论中告诉我(释义):

  • 我的表情是的串联一个单引号字符串,一个双引号字符串(变量),然后是另一个短单引号字符串

作为一个非专业的系统管理员,我可能sed每两年使用一次,我发现它的语法有点难以记住,并且对于像我这样不定期使用它的人来说有点令人困惑(Kuslananda 提供的引用规则有点令人困惑)对我来说,更不用说整个sed命令通常都是用单引号引起来的)。
也许有一种方法可以让善行南达的命令对其他人和我自己来说更加“直观”或“易于理解”。也许一些反斜杠将命令分解会有所帮助,或者另一个实用程序可能更适合我进行此类文本替换。


如何从命令行替换 (PHP) 文件中的电子邮件没有 sed

答案1

仅当外部引用级别是双引号时,引用的 shell 变量才会被扩展。为了显示:

$ var=foo
$ echo '"$var"'
"$var"
$ echo "'$var'"
'foo'

因此,只有在以下情况下变量才会扩展他们周围的报价水平是双倍的。

下一个问题是你的正则表达式是错误的。$正则表达式中的意思是“行尾”,所以你不能有多个$这样的。我不太明白你想用这个正则表达式做什么,所以我假设你想更改在 string 之后找到的电子邮件地址$to =。如果是这样,请尝试以下操作:

sed -i "s/\\$to = \"[^\"]*\"/\\$to = $new_email_address/" FILE

我必须转义"( \") 和$( \$to) 以避免被$to读取为变量,因此内部"不会关闭开口"。我还必须添加另一层转义层 ( \\$),以便$shell 看不到 ,而是将其传递给 sed。是的,我意识到这非常复杂。

或者,您可以将其分成多个单引号和双引号表达式,正如我认为您想要做的那样:

sed 's/\$to = "[^"]*"/$to = '"$new_email_address"'/' FILE

答案2

您可以使用awk实用程序根据您在命令行上使用 -F 选项设置的分隔符分隔的字段来查看行。

read new_email_address
awk -F '"' -v new="$new_email_address" '
  $1 == "$to = " {$2 = new}
1' OFS='"' your_phpfile

awk -v q=\" -v new="$new_email_address" '
BEGIN {
  new_esc = new
  gsub(/[&]/, "\\\\&", new_esc)
  repl = q new_esc q";"
}
sub(\
    /\$to = ".*";$/, \
     "$to = " repl   \
)+1' your_phpfile

相关内容