我有一个 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