在 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`的主要内容,如果未能解决你的问题,请参考以下文章

Solaris里面的sed怎样把指定字符替换成换行

系统安装 Solaris10 For X86 安装

perl替代sed分裂多个|

虚拟机安装Solaris11.2

Pyp–一个替代sed,awk的文本处理工具

在 Solaris 10 上编译 quickfix