【问题标题】:replace words using grep and sed in shell在 shell 中使用 grep 和 sed 替换单词
【发布时间】:2010-11-29 01:15:17
【问题描述】:

我有大约 150 个文件,我想在其中删除以下代码:

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="/height.js"></SCRIPT>

我正在做的是:

sed -e 's/<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="/height.js"></SCRIPT>/ /' file_names

这似乎不起作用。

我想一次性从所有文件中删除此脚本。我该怎么做?

【问题讨论】:

    标签: shell filesystems sed grep replace


    【解决方案1】:

    您不必将 / 与 s 命令一起使用:

    sed 's|old|new|' files...
    

    如果你想做内联替换,那么第一步是备份你所有的文件然后发出这个命令,用你选择的字符串替换'old'和'new':

    sed -i .bak 's|old|new|' files...
    

    因为内联替换非常危险,我怎么强调都不过分,您必须在运行命令之前备份所有文件

    我是否提到过您应该备份所有文件

    【讨论】:

      【解决方案2】:

      您必须担心要替换的文本中的斜线。

      • 或者:对每个斜杠使用“\/”,
      • 或者:作弊并使用“.”匹配应该出现斜线的任何字符。

      另一种方法是利用包含 HTML 的文件的不可能性。从理论上讲,如果您不喜欢第二种选择,您还应该在您正在查看的字符串中出现“.”的每个位置使用“\.”。

      sed -e 's/<SCRIPT LANGUAGE="JavaScript" TYPE="text.javascript" SRC=".height.js"><.SCRIPT>/ /' file_names
      

      这是从您的示例中复制的,斜杠被点替换。但是,像这样在命令行上提供所有文件名只会将输出作为所有已编辑文件的串联写入标准输出。

      通常,要或多或少地在原地编辑文件,您会这样写:

      tmp=${TMPDIR:-/tmp}/xxx.$$
      trap 'rm -f $tmp; exit 1' 0 1 2 3 13 15
      for file in ...list...
      do
          sed -e '...' $file > $tmp
          mv $tmp $file
      done
      rm -f $tmp
      trap 0
      

      这包括对临时的合理防弹清理——它并不完美。此变体在将原始版本替换为已编辑版本之前会对其进行备份:

      tmp=${TMPDIR:-/tmp}/xxx.$$
      trap 'rm -f $tmp; exit 1' 0 1 2 3 13 15
      for file in ...list...
      do
          sed -e '...' $file > $tmp
          mv $file $file.bak
          mv $tmp $file
      done
      rm -f $tmp
      trap 0
      

      使用 GNU sed,您可以使用“-i”或“--in-place”选项覆盖文件;您可以使用“--in-place=.bak”为file.bak 中的每个file 创建备份副本。

      【讨论】:

      • sed -e 's/\
      • (a) 在使用任何东西之前,您正在测试文件的虚拟副本,不是吗? (b) 您不需要在表达式中随机散布反斜杠 - 您错过了可能实际上有好处的点之前的反斜杠。然而,这些都没有解释发生了什么。在没有 GNU 特定的“-i”选项的情况下运行 sed,sed 本身无法破坏您的文件;它以只读模式工作。因此,您正在使用的周围的 shell 脚本中一定有错误。
      • 如果您按照其他人的建议尝试了“sed -e 's/.../ /' &lt; file &gt; file”(我希望作为临时异常),那么 shell 会自动为您破坏您的文件。你使用的命令是什么并不重要——shell在执行命令之前会破坏文件;命令执行前为空。
      • heheh yaa 显然我不会使用我的原始文件进行测试.....我的文件非常安全 :-) ..........我使用带点的反斜杠(。)也一样,但它仍然没有工作....代码就是这样:-(
      • @Jonathan:您的代码运行良好,但问题是在 shell 屏幕上它显示的输出没有脚本代码,但是当我在 FTP 上检查我的文件时,它们仍然包含那个旧脚本...... .为什么会这样???当我已经运行该代码以删除脚本时,为什么它仍然存在于文件中???我在 shell 中不是很好,所以请指导!!!
      【解决方案3】:

      你应该通过管道输出 例如

      sed -e 's/<.*SRC="\/height.js".*>//g' < foo.html > foo1.html
      

      【讨论】:

      • 我试过了,但这是它显示的错误:- sed: -e expression #1, char 24: unknown option to `s'
      • Bad, bad, bad, bad I/O 重定向 - 输出重定向在命令执行之前破坏输入文件(清空它) ,更不用说从中读取任何内容了。您刚刚创建了一个空文件。
      【解决方案4】:

      您需要使用额外的反斜杠转义特殊字符。

      请注意,输出也将全部发送到控制台。如果您想要 150 个单独的输出文件,您可能需要查看 xargs 命令,例如:

      ls -1 | xargs -t -i 'sed -e -i "替换评论" {}'

      请注意,sed '-i' 选项将在适当位置编辑文件,因此请先正确替换并备份文件!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        • 2018-02-24
        • 2021-09-30
        相关资源
        最近更新 更多