在 Solaris 上替代 `sed -i`
Posted
技术标签:
【中文标题】在 Solaris 上替代 `sed -i`【英文标题】:Alternative to `sed -i` on Solaris 【发布时间】:2011-04-04 07:59:06 【问题描述】:在 Linux 上 sed -i
将修改输入文件。但它不适用于 Solaris。
sed -i '$ s/OLD/NEW/g' test
sed: illegal option -- i
在 Solaris 上我可以用什么代替 sed -i
?
【问题讨论】:
在 Linux 上sed -i
将修改输入文件。 不是 - GNU sed -i
creates a new temp file and then renames it to the original file name, deleting the original file in the process.
【参考方案1】:
您需要自己复制-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"
【讨论】:
或者,将原始文件复制到临时文件,重定向命令以覆盖原始文件(如果命令失败则恢复),然后删除副本。【参考方案2】:它与 sed -i 不完全相同,但我遇到了类似的问题。你可以使用 perl 来做到这一点:
perl -pi -e 's/find/replace/g' file
复制/移动仅适用于单个文件。如果您想在目录和子目录中的每个文件中替换一些文本,您需要一些东西来完成它。你可以用 perl 做到这一点并找到:
find . -exec perl -pi -e 's/find/replace/g' '' \;
【讨论】:
当被找到/替换的字符串包含斜杠和单引号时效果不佳。尝试在没有运气的情况下逃脱这些角色。 完整的答案是,它适用于 GNU sed。您可以在 Solaris 中安装 GNU sed 并享受。如果不可能,使其与 Solaris sed 一起工作的方法是:( rm -f myfile ; sed 's/../../' > myfile) < myfile
。 信用:board.issociate.de/thread/460042
这是实现上述约翰解决方案的另一种方式。 ^_^【参考方案3】:
另外一个“单行”命令适用于 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_to_delete.txt
中的file.to_edit.txt
中删除字符串。文件strings_to_delete.txt
包含多行,每行一个字符串。
【讨论】:
这有什么新变化?这与现有答案完全相同(写入临时文件,如果成功,将其移到原始文件上)。 没有关于 tmp 文件的新信息,但是有关于如何使用 sed 删除多个字符串的信息,我在之前的对话中错过了这些信息。好吧,也许不是正确的线程。 它失去了原来的权限。以上是关于在 Solaris 上替代 `sed -i`的主要内容,如果未能解决你的问题,请参考以下文章