【问题标题】:sed -i option is not working on solarissed -i 选项在 solaris 上不起作用
【发布时间】:2011-05-06 12:32:14
【问题描述】:

我正在使用 sed 将文件中的一行替换为 NULL。我使用的命令是

sed -i "s/.*shayam.*//g" FILE

这在 linux 中运行良好。 shayam 在 FILE 中被替换为空白。但是当我在solaris中使用它时,它显示了一些错误。

sed: 非法选项 -- i

如何在 solaris 中使用 sed 的 -i 功能。请帮忙。

【问题讨论】:

    标签: unix sed solaris


    【解决方案1】:

    -i 选项是 GNU 特定的。 Solaris 版本不支持该选项。

    您需要安装 GNU 版本,或将新文件重命名为旧文件:

    sed 's/.shayam.//g' FILE > FILE.new && mv FILE.new FILE
    

    【讨论】:

    • 使用 mktemp 有助于确保我们不会无意中踩到任何名为 FILE.new ... tmp=$(mktemp) && sed -e 's/.*shayam.*// g' 文件 > "$tmp" && mv "$tmp" 文件; rm "$tmp" 2> /dev/null
    【解决方案2】:

    我刚刚回答了一个类似的问题sed -i + what the same option in SOLARIS,但是对于那些找到此主题的人(我在相关主题部分看到了它):

    我看到的大多数答案的主要问题是,如果您想修改多个文件,它就不起作用。我在另一个帖子中给出的答案:

    它与 sed -i 不完全相同,但我遇到了类似的问题。你 可以使用 perl 做到这一点:

    perl -pi -e 's/find/replace/g' file
    

    复制/移动仅适用于单个文件。如果你想 替换目录中每个文件的一些文本和 子目录,你需要一些东西来完成它。你可以做 这与 perl 并找到:

    find . -exec perl -pi -e 's/find/replace/g' '{}' \;
    

    【讨论】:

      【解决方案3】:

      sed doesn't haven an -i option.

      您可能正在使用sed 的某些特定于供应商的变体。如果您想使用供应商特定的非标准化变体sed 的供应商特定的非标准化扩展,您需要确保安装了所述供应商特定的非标准化变体并且需要确保您调用 it 并且不要调用符合标准的sed 版本,它是您的操作环境的一部分。

      请注意,与往常一样,在使用非标准化的供应商特定扩展时,绝对不能保证您的代码是可移植的,这正是您所看到的问题。

      然而,在这种特殊情况下,有一个更好的解决方案:为工作使用正确的工具。 sed 是一个流编辑器(这就是它被称为“sed”的原因),即它用于编辑流,而不是文件。如果要编辑文件,请使用文件编辑器,例如ed:

      ed FILE <<-HERE
        ,s/.shayam.//g
        w
        q
      HERE
      

      另见:

      【讨论】:

        【解决方案4】:

        要么cat 文件或尝试&lt;? 然后通过管道 (|) 将结果传输到临时文件,如果一切顺利 (&amp;&amp;) mv 将临时文件传输到原始文件。

        例子:

        cat my_file | sed '!A!B!' > my_temp_file && mv my_temp_file my_file
        

        【讨论】:

          猜你喜欢
          • 2011-04-04
          • 2013-09-02
          • 2012-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-05
          • 2011-10-11
          • 1970-01-01
          相关资源
          最近更新 更多