Shell Solaris上“sed-i”的替代方案

Shell Solaris上“sed-i”的替代方案,shell,unix,sed,solaris,Shell,Unix,Sed,Solaris,在Linux上,sed-i将在适当的位置修改输入文件。不过,它在Solaris上不起作用 sed -i '$ s/OLD/NEW/g' test sed: illegal option -- i 在Solaris上,我可以使用什么来代替sed-I?您需要自己复制-I的行为,方法是将结果存储在临时文件中,然后用临时文件替换原始文件。这可能看起来不雅观,但这就是sed-i在幕后所做的一切 sed '$ s/OLD/NEW/g' test > test.tmp &&am

在Linux上,sed-i将在适当的位置修改输入文件。不过,它在Solaris上不起作用

sed -i '$ s/OLD/NEW/g' test        
sed: illegal option -- i

在Solaris上,我可以使用什么来代替
sed-I

您需要自己复制
-I
的行为,方法是将结果存储在临时文件中,然后用临时文件替换原始文件。这可能看起来不雅观,但这就是
sed-i
在幕后所做的一切

sed '$ s/OLD/NEW/g' test > test.tmp && cat test.tmp > test && rm test.tmp
如果您愿意,您可以使用
mktemp
,使其更加健壮:

tmp=$(mktemp test.XXXXXX)
sed '$ s/OLD/NEW/g' test > "$tmp" && cat "$tmp" > test && rm "$tmp"

它与sed-i并不完全相同,但我有一个类似的问题。您可以使用perl执行此操作:

perl -pi -e 's/find/replace/g' file
仅对单个文件执行复制/移动操作。如果你想在一个目录和子目录中的每个文件中替换一些文本,你需要一个合适的方法。您可以使用perl执行此操作,并找到:

find . -exec perl -pi -e 's/find/replace/g' '{}' \;
在bash环境中的Solaris 11主机上,还有一个“一行”命令:

for i in `cat strings_to_delete.txt`
do 
    sed "/$i/d" file.to_edit.txt > file.edited.txt &&
        mv file.edited.txt file.to_edit.txt
done

它从文件
strings\u到
file.to\u edit.txt中的\u delete.txt
删除字符串。文件
strings\u to_delete.txt
包含多行,每行一个字符串。

或者,将原始文件复制到临时文件,重定向命令以覆盖原始文件(如果命令失败,则恢复),然后删除副本。这有什么新功能?这与现有答案完全相同(写入临时文件,如果成功,将其移到原始文件上)。没有关于tmp文件的新信息,但有如何使用sed删除多个字符串的信息,我在上一次对话中遗漏了这些信息。嗯,可能不是正确的线程。它会释放原始权限。当正在查找/替换的字符串包含斜杠和单引号时,该线程不起作用。试图逃脱这些角色,但没有运气。完整的答案是,它与GNU sed一起工作。您可以在Solaris中安装GNU sed并享受其中的乐趣。如果不可能,使其与Solaris sed一起工作的方法是:
(rm-f myfile;sed's/./../'>myfile)
。信贷:这是实现上述John解决方案的另一种方式^_^在Linux上,sed-i将在适当的位置修改输入文件。不是真的-