我有一个包含日志文件的目录,我想匹配一个模式来删除它,并将内容重新写入相同的文件中。
问题的出现原因是在OSX上使用BSD sed版本时可能会出现问题,因此作者安装了GNU sed版本来替代BSD sed版本。解决方法是通过Homebrew安装GNU sed,并使用--with-default-names
参数将BSD sed替换为GNU sed。另外,还有另一种解决方法,即安装不带default-names参数的GNU sed,并在脚本中根据系统选择使用gsed
或sed
。
在安装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
。
问题的出现原因是在不同操作系统上,GNU sed命令的使用方式存在差异。在GNU系统中,可以使用sed -i -e 's/foo/bar/' target.file
或sed -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命令在不同操作系统上进行文件匹配和替换操作时,需要注意命令的格式差异,以保证正常工作。
问题的原因是用户想要在日志文件目录中匹配一个模式并删除它,然后再将内容写回相同的文件。解决方法是使用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"
。