sed和php:用'变量'替换$ variable

时间:2012-12-03 01:41:46

标签: php sed replace

在php脚本中,我有一些表达式为$variable_like_that, $variable_like_other, $variable_this_thing, $variable_like_this ...我想找到并将它们替换为未定义的变量,如'variable_like_that', 'variable_like_other', 'variable_this_thing', 'variable_like_this'。它们都以$ variable开头。

我尝试用sed做一些事情,其语法对于没有经验的人来说非常奇怪:

sed -e "s/$variable_(.*\)/('\)$variable_(.*\)\('\)/g" myscript.php

我知道,我还不太熟悉它......

所以我的问题是:

  • 是否适合这项工作?
  • 如果是的话,我会很感激帮助你做正确的事。
  • 如果没有,我会感激一些建议。

2 个答案:

答案 0 :(得分:2)

是否适合这项工作?

我认为sed对于您正在尝试的工作来说是一个很好的工具。你尝试的模式很接近,但有一些问题:

  • 选项swith,-e
  • 您的替换命令的搜索/替换模式。

我应该使用哪个选项开关?

而不是sed -e,而是将结果输出到stdout但保持文件不变,您希望使用sed -i来编辑“in-place”< / em>,保存对文件所做的更改。来自sed的man page关于-i开关:

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if extension supplied)

我的替换命令的搜索/替换模式怎么样?

对于发送给sed的替换命令,您希望匹配以$variable开头的字符串,然后以其他任何内容结束。我将使用的搜索模式是:

\$\(variable\w\+\) 

关于这一点:

  • (我们需要使用$转义\,因为$本身具有特殊含义(行尾))
  • \w是正则表达式模式,匹配任何类似字的字符以及_
  • \+表示“之前的一个或多个模式”
  • 在转义括号内的任何内容,例如\(...\)被置于一个组中,用于交替模式或被“记住”以进行替换。在我们的例子中,我们使用它们来记住它们进行更换。

总之,它基本上意味着,“找到以$variable开头然后以其他任何东西结束的字符串,并记住你找到的东西(减去美元符号,因为它不在括号内)。”

接下来,我们需要指定替换模式。由于我们有一个我们想要找到的模式,我们只需要指定替换它的内容:

'\1'

\1代表“第一个反向引用”,其中反向引用是“与我们想要记住的第一个模式相匹配的东西(我们放在\(\)中的内容”的奇特术语)。

另请注意:

  • 您的搜索模式中可以有多个\(\)组;第二个是\2,第三个是\3等等。
  • \0是一个特殊的反向引用,其中包含与搜索模式匹配的整个字符串。 (在我们的例子中,它还包含我们要删除的$。)

此外,我们希望替换我们找到的搜索模式的每一个匹配项,而不仅仅是文件中的一行。这是用g标志指定的,它代表“全局”。 替换命令s,搜索模式,替换模式和全局标志都由斜杠字符/分隔。

这就是替换命令。之后,您将文件名或shell file pattern作为第三个参数传递给sed。把这一切放在一起,我们得到:

sed -i "s/\$\(variable\w\+\)/'\1'/g" myscript.php

我将自己的myscript.php小版本汇集在一起​​,以测试并验证我制作的正则表达式是否能满足您的需求。作为参考,我在之前包含了,在之后包含了

之前:

<?php
lorem ipsum $variable_like_that 
foo bar $variable_like_other baz
one two three $variable_this_thing four
$variable_like_this five six seven eight
?>

后:

<?php
lorem ipsum 'variable_like_that' 
foo bar 'variable_like_other' baz
one two three 'variable_this_thing' four
'variable_like_this' five six seven eight
?>

有关详细信息,您还可以在此处阅读更多信息:Sed - An Introduction and Tutorial by Bruce Barnett

希望这有帮助!

答案 1 :(得分:-1)

需要转义$并使用右侧的\ 1来替换与()

匹配的内容
sed -e "s/\$variable_\([^ ,]*\)/'variable_\1'/g" myscript.php