从shell脚本中搜索并替换完整的内容行

时间:2017-12-29 17:27:06

标签: shell sed

我有一个来自插件的2个WordPress文件(php),无论何时更新,我都希望自动修复一些最适合我的行。

我在CentOS中运行我的网站,并且我可以完全控制机器,因此我可以通过Cron运行shell脚本进行自动化任务。

我如何搜索和替换(不是通过行号,因为它是第三方插件,所有者可能会改变位置,因为它只是为我的网站定制我不能请求"错误修复",因为它不是错误,而是我网站的改进)。我将缩短mod,因为它将是大量的mods来申请这两个文件,我只需要知道如何做到这一点。

类recovery.php

搜索:function dump_files( $warning = false ) {并替换为:function dump_files( $warning = false ) { $cancel_order;

类prompt.php

搜索:private $replace_only;并替换为:private $replace_only = true;

我怎样才能完成这项工作?我正在浏览StackOverFlow,有些用户建议使用sed进行搜索和替换,但由于这不是纯文本而是php个文件,这个sed会适用吗?或者有更好的解决方案吗?

- 编辑 如何使用SED进行多行搜索和替换?我使用的是传统方式,但当它的2行(及以上)缩进时它不会被替换。例如:

if ( empty( $donot_dump ) ) {
                return false;

类似于:

if ( empty( $donot_dump ) ) {
                return true;

1 个答案:

答案 0 :(得分:1)

是的,当然sed可以应用于任何文本文件格式。您需要做的就是使用语法s/orignial/replace语法进行搜索和替换。如果使用-i语法,它将直接替换文件的内容。所以你需要的只是

sed -i.bak "s/function dump_files( \$warning = false ) {/function dump_files( \$warning = false ) { \$cancel_order;/g" class-recovery.php

和第二个文件

sed -i.bak "s/private \$replace_only;/private \$replace_only = true;/g" class-prompt.php

通常我们在'的参数周围使用sed(单引号),但由于源字符串周围有空格我们需要保留它,所以双引号字符串会这样做。另外,在$之前的双引号变量具有特殊含义,即shell将它们视为变量并尝试扩展它。我们需要使用\来逃避它,以便知道它不是变量而是文字。

-i.bak是为了能够在扩展名.bak下存储该文件的副本并替换原始文件,以便如果sed未按预期替换您的文件内容,则可以总是用这个文件恢复它。

如果您不想存储备份文件,请删除.bak并保持为-i

如果您的替换字符串需要换行符,请使用\\n和常用空格来根据需要设置格式。例如,

sed "s/function dump_files( \$warning = false ) {/function dump_files( \$warning = false )\\n { \$cancel_order;/g" file

产生如下输出

function dump_files( $warning = false )
 { $cancel_order;