【问题标题】:Bulk editing files through command line?通过命令行批量编辑文件?
【发布时间】:2013-11-20 20:14:18
【问题描述】:

我有一个大约 500 个文件夹的列表。每个文件夹中都有一个functions.php 文件。

我需要在每个 functions.php 文件中搜索以下文本:

function wp_initialize_the_theme_finish()

我需要将任何包含上述文本的行替换为:

function wp_initialize_the_theme_finish() { $uri = strtolower($_SERVER["REQUEST_URI"]); if(is_admin() || substr_count($uri, "wp-admin") > 0 || substr_count($uri, "wp-login") > 0 ) { /* */ } else { $l = 'mydomain.com'; $f = dirname(__file__) . "/footer.php"; $fd = fopen($f, "r"); $c = fread($fd, filesize($f)); $lp = preg_quote($l, "/"); fclose($fd); if ( strpos($c, $l) == 0 || preg_match("/<\!--(.*" . $lp . ".*)-->/si", $c) || preg_match("/<\?php([^\?]+[^>]+" . $lp . ".*)\?>/si", $c) ) { wp_initialize_the_theme_message(); die; } } } wp_initialize_the_theme_finish();

注意:我需要用我的新行替换整行,而不仅仅是开头。

任何帮助将不胜感激。

【问题讨论】:

  • sed 将能够为您做到这一点,使用 -i(就地)标志
  • 我实际上能够在一个文件上做到这一点。我想我不明白的部分是如何搜索所有文件夹中的所有functions.php文件并一次替换所有内容......
  • 我回答了你是如何找到所有文件的

标签: shell command-line ssh command


【解决方案1】:

上面写着非常详细的article。似乎与您的问题非常相关。本质上,命令是:

find . -name "*/function.php" -print | xargs sed -i 's/foo/bar/g'

foo 在哪里:

 function wp_initialize_the_theme_finish().+\n

而酒吧是:

function wp_initialize_the_theme_finish() { $uri = strtolower($_SERVER["REQUEST_URI"]); if(is_admin() || substr_count($uri, "wp-admin") > 0 || substr_count($uri, "wp-login") > 0 ) { /* */ } else { $l = 'mydomain.com'; $f = dirname(__file__) . "/footer.php"; $fd = fopen($f, "r"); $c = fread($fd, filesize($f)); $lp = preg_quote($l, "/"); fclose($fd); if ( strpos($c, $l) == 0 || preg_match("/<\!--(.*" . $lp . ".*)-->/si", $c) || preg_match("/<\?php([^\?]+[^>]+" . $lp . ".*)\?>/si", $c) ) { wp_initialize_the_theme_message(); die; } } } wp_initialize_the_theme_finish();

使用following rules 转义 foo 和 bar 中的特殊字符: 简而言之,对于 sed:

  1. 在单引号之间写入正则表达式。
  2. 使用“\”搜索单引号。
  3. 在 $.*/[]^ 之前加一个反斜杠,并且只加那些字符。

【讨论】:

  • 我在尝试时不断收到此错误:sed: -e expression #1, char 239: unknown option to s'`
  • 刚刚试了一下,得到了这个错误:sed: -e expression #1, char 239: unknown option to s
  • \Q\Eperl 中受支持,在 sed 中不受支持
  • 很抱歉。我的错。对于 sed,您需要使用以下规则: 简而言之,对于 sed:在单引号之间写入正则表达式。使用 '\'' 搜索单引号。在 $.*/[]^ 之前加一个反斜杠,并且只加那些字符。
【解决方案2】:

由于搜索和替换字符串相当长,首先将它们存储在变量中。

然后尝试将findsed 一起使用-exec 选项

#!/bin/bash

search='^.*function wp_initialize_the_theme_finish().*$'
replace='function wp_initialize_the_theme_finish() { $uri = strtolower($_SERVER["REQUEST_URI"]); if(is_admin() || substr_count($uri, "wp-admin") > 0 || substr_count($uri, "wp-login") > 0 ) { /* */ } else { $l = "mydomain.com"; $f = dirname(__file__) . "/footer.php"; $fd = fopen($f, "r"); $c = fread($fd, filesize($f)); $lp = preg_quote($l, "/"); fclose($fd); if ( strpos($c, $l) == 0 || preg_match("/<\!--(.*" . $lp . ".*)-->/si", $c) || preg_match("/<\?php([^\?]+[^>]+" . $lp . ".*)\?>/si", $c) ) { wp_initialize_the_theme_message(); die; } } } wp_initialize_the_theme_finish();'

find -type f -name 'function.php' -exec sed -i "s/${search}/${replace}/g" {} \;

使用xargs的其他替代方法

find -type f -name 'function.php' -print0 | xargs -0 sed -i "s/${search}/${replace}/g"

【讨论】:

    【解决方案3】:

    使用find命令,搜索所有相关文件,然后使用sed -i更新文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2013-03-24
      • 2018-11-18
      相关资源
      最近更新 更多