在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
我知道,我还不太熟悉它......
所以我的问题是:
答案 0 :(得分:2)
我认为sed
对于您正在尝试的工作来说是一个很好的工具。你尝试的模式很接近,但有一些问题:
-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