0

在一个 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

我知道,我还不是很精通它...

所以我的问题是:

  • sed 是适合这项工作的工具吗?
  • 如果是的话,我会很感激帮助把事情做好。
  • 如果不是,我将不胜感激一些建议。
4

2 回答 2

2

sed 是适合这项工作的工具吗?

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

  • 选项开关-e、 和
  • 您的替换命令的搜索/替换模式。

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

您想使用, 来“就地”编辑文件,而不是将sed -e其输出结果但保持文件不变的 ,将所做的更改保存回文件。从 sed 的关于开关的手册页:stdoutsed -i-i

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

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

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

\$\(variable\w\+\) 

关于这一点的几点:

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

总之,它的基本意思是“查找以其他任何内容开头$variable然后结尾的字符串,并记住您找到的内容(减去美元符号,因为它不在括号内)。”

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

'\1'

代表“第\1一个反向引用”,其中反向引用是“与我们想要记住的第一个模式匹配的东西(我们放在\(\).

另请注意:

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

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

这就是替换命令。之后,将文件名或shell 文件模式作为第三个参数传递给 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 - Bruce Barnett 的介绍和教程

希望这可以帮助!

于 2012-12-03T02:36:09.223 回答
0

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

sed -e "s/\$variable_\([^ ,]*\)/'variable_\1'/g" myscript.php
于 2012-12-03T02:10:59.133 回答