我有一个包含日志文件的目录,我想匹配一个模式来删除它,并将内容重新写入相同的文件中。

11 浏览
0 Comments

我有一个包含日志文件的目录,我想匹配一个模式来删除它,并将内容重新写入相同的文件中。

有没有一种在Linux和Mac上都能工作的无备份的就地编辑的sed调用方式?尽管OS X附带的BSD sed似乎需要sed -i \'\' ...,而通常附带GNU sed的Linux发行版则将引号解释为空输入文件名(而不是备份扩展名),并且需要sed -i ...。\n是否有任何命令行语法可以同时适用于这两种风格,以便我可以在两个系统上使用相同的脚本?

0
0 Comments

问题的出现原因是在OSX上使用BSD sed版本时可能会出现问题,因此作者安装了GNU sed版本来替代BSD sed版本。解决方法是通过Homebrew安装GNU sed,并使用--with-default-names参数将BSD sed替换为GNU sed。另外,还有另一种解决方法,即安装不带default-names参数的GNU sed,并在脚本中根据系统选择使用gsedsed

在安装GNU sed时,作者提到了一些注意事项。首先,--with-default-names参数已经从homebrew-core中移除,作者提供了一个链接以获取更多信息。其次,安装GNU sed后,需要将gnubin添加到PATH中,作者给出了具体的路径:PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"。此外,homebrew包的页面建议将这个路径添加到bashrc中:PATH="$(brew --prefix)/opt/coreutils/libexec/gnubin:$PATH"

总之,这篇文章介绍了在OSX上使用GNU sed版本替代BSD sed版本的问题以及解决方法,包括安装GNU sed和配置PATH

0
0 Comments

问题的出现原因是在不同操作系统上,GNU sed命令的使用方式存在差异。在GNU系统中,可以使用sed -i -e 's/foo/bar/' target.filesed -i'' -e 's/foo/bar/' target.file来进行文件匹配和替换操作。但是在OS X操作系统上,这两种写法都不能正常工作。

解决方法是针对不同操作系统分别使用不同的命令格式。在OS X上,可以使用sed -i '' -e 's/foo/bar/' target.file来进行文件匹配和替换操作。这是因为在OS X系统中,不能使用sed -i -e命令,因为备份文件的扩展名会被设置为-e。同样的道理,也不能使用sed -i'' -e命令,因为-i''之间需要有一个空格。

需要注意的是,在shell解析命令时,-i-i''是完全相同的,因此sed在这两种写法的第一次调用时不会有不同的行为,因为它接收到的是完全相同的参数。

当使用GNU sed命令在不同操作系统上进行文件匹配和替换操作时,需要注意命令的格式差异,以保证正常工作。

0
0 Comments

问题的原因是用户想要在日志文件目录中匹配一个模式并删除它,然后再将内容写回相同的文件。解决方法是使用sed -i命令来实现。

sed -i命令可以在GNU和BSD/Mac的sed上工作。具体命令为:sed -i.bak 's/foo/bar/' filename,其中注意到命令中没有空格和有一个点。

这种方法可以在GNU sed和BSD sed上都实现。用户可以删除后缀为.bak的备份文件。

在macOS Sierra(以及可能的较早版本)上,当使用-i选项调用sed时,它不接受位置参数作为command参数。必须使用另一个标志-e。因此,命令变为sed -i.bak -e 's/foo/bar/' filename

这种方法可以在编辑的同时创建备份文件。所以完整的解决方案是:sed -i.bak 's/foo/bar/' file && rm file.bak

注意,点号并不重要。可以使用sed -ibak 's/foo/bar/' kinefile命令来创建kinefilebak而不是kinefile.bak。只要删除时使用rm $1bak而不是rm $1.bak,它就能正常工作。尽管在ls列表中,xyz.bak文件比xyzbak文件更容易区分,*.bak*bak更自然,而且如果文件名在变量$f中,则必须使用"${f}bak"而不是更简单的"$f.bak"

0