2010-11-08 79 views
9

我正在使用sed替换文件中的NULL行。我使用的命令是sed -i选项无法在solaris上工作

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

这是在Linux工作正常。在FILE中,将shayam替换为空白。但是,当我在solaris中使用它时,它显示出一些错误。

sed的:非法选项 - 我

如何使用Solaris中的sed -i功能。请帮助。

回答

11

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

您需要安装GNU版本,或重命名新的文件覆盖旧的:

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

使用mktemp的帮助,以确保我们不会无意中上&& SED -e命名FILE.new ... TMP = $(mktemp的)任何文件步骤's /.* shayam。* // g'FILE>“$ tmp”&& mv“$ tmp”FILE; rm“$ tmp”2>/dev/null – 2015-11-26 04:47:14

0

要么cat该文件或尝试<? 然后pipe(|)将结果复制到临时文件,如果一切顺利(&&mv tempfile到原始文件。

实施例:

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

sed doesn't haven an -i option

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

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

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

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

参见:

11

我刚才已经回答了类似的问题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' '{}' \;