【问题标题】:search and replace block of code in all files in linux在linux中的所有文件中搜索和替换代码块
【发布时间】:2012-05-20 09:44:01
【问题描述】:

这个问题在哲学上类似于这里一次又一次出现的问题:

但是它们(除了最后一个)都处理简单的替换。我有一大段代码出现在许多文件中(我希望复制/粘贴源代码会受到法律惩罚),我需要替换它。

这里有什么可以帮助我的吗?我想避免将块“sed”化(如上面第三个类似问题中所做的那样),因为这将花费一天的大部分时间。如果我必须临时安装一些特定的文本编辑器,那就这样吧。

【问题讨论】:

  • 输入是大量的PHP文件,代码块是相当长的PHP和内联Javascript的混合体。我只想用 include('includes/menu.php'); 替换它,它包含一个更正的版本,但内联/转义原始版本将是一场噩梦
  • 如果有问题的代码块可以用正则表达式定义,我认为 sed 仍然是你最好的选择。如果它不能被定义,但存在于每个文件的相同位置(相同的行号开始和结束),你可能会用一个花哨的 tr 来做到这一点。如果您都没有,我猜您将不得不手动完成。
  • @juwiley 是否可以定义一个正则表达式,基本上说“查找字符串'general_help',并将<?php的块匹配到包含它的?>?我不是非常适合正则表达式:-\
  • 关于 sed 的说明,似乎很难让它与多行输入很好地配合

标签: linux search replace


【解决方案1】:

如果开头和结尾行是唯一的,您可以删除该块并使用 with sed 将其替换为您的代码:

placeholder=somereallyuniquestringthatwillneverbematched
for i in *.php; do
    # Remove original block using first and last line matching and add placeholder
    sed -i -e "/The text of the closing line/a\
$placeholder
/The Text of the opening Line/,/The Text Of The Closing Line/d" "$i"
     # Replace placeholder with desired code
     sed -i -e "s/$placeholder/#include ('include/menu.php');/" "$i"
 done

这只会发现每个文件出现一次块。与往常一样,请先进行备份。

【讨论】:

    【解决方案2】:

    关于您的问题的好处是您处理的是固定字符串而不是正则表达式......这使得问题相对简单。您可以write something 为您完成这项工作,没有太多问题。

    我链接的解决方案不是最佳的,但它确实有效,并且它不依赖于仅匹配开头/结尾行(即,它只替换逐字匹配)。基本思路是:

    • 读入定义我们要查找的文件的文件,
    • 读入定义我们替换的文件,
    • 遍历所有其他参数,查找搜索字符串并将其替换为替换文本

    【讨论】:

    • 这看起来很棒,现在测试一下
    • gh!副本之间的缩进都不匹配。我讨厌成为他们“修复”外包代码的人 :( 不过,这可能是我总体上最好的选择,所以标记为已接受
    • 听起来不好玩。祝你好运!
    猜你喜欢
    • 2018-06-06
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2020-05-12
    • 2012-12-25
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多