我正在处理一个bash脚本并遇到sed的问题,我正在使用它清理空白文件。
以下是定义文件的块以及我为清理文件而创建的函数:
# Define Review Log file
reviewlog=/home/serverreview-$(date +%d%^b%y).txt
# Bleachs the Review Log of the color customization
bleach ()
{
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" $reviewlog >> $reviewlog
}
使用>>它确实将信息附加到文件的底部。但是,如果我使用:
bleach ()
{
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" $reviewlog > $reviewlog
}
它使输出文件完全空白
答案 0 :(得分:1)
这是正常的,因为 sed 在写入时读取。第一次写入将截断文件。这结束了阅读并留下了一个空文件。
在某些情况下,当工具在写入之前读取缓冲区时,它将适用于小输入。但这不是你不想依赖的。因此,如果该工具没有就地覆盖选项,请不要使用它。
您可以写入临时文件并在infile上重命名或重命名文件内(或打开文件内,然后将其删除),然后写入预期位置。否则你必须确保将所有内容都读入内存。
带有和不带扩展名的 sed -i
确实有效。例如,请参阅https://robots.thoughtbot.com/sed-102-replace-in-place,其中介绍了-i
变体。