sed 是适合这项工作的工具吗?
我认为sed
对于您正在尝试做的工作来说,这是一个很好的工具。您尝试的模式很接近,但有一些问题:
- 选项开关
-e
、 和
- 您的替换命令的搜索/替换模式。
我应该使用哪个选项开关?
您想使用, 来“就地”编辑文件,而不是将sed -e
其输出结果但保持文件不变的 ,将所做的更改保存回文件。从 sed 的关于开关的手册页:stdout
sed -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 的介绍和教程。
希望这可以帮助!