有一种方法来捕获文件,按某种方式对其进行过滤,然后输出一个具有相同名称的新文件?我这样做,我得到一个空文件,但如果我用不同的文件名创建它是有效的。我不想创建新文件。
示例:
File="My_test_file.txt"
cat ${File} | grep -v "test" > ${File}
以这种方式不起作用,我必须创建另一个文件才能使其正常工作,如下所示:
File="My_test_file.txt"
cat ${File} | grep -v "test" > ${File}.tmp
任何想法?
答案 0 :(得分:2)
有一个名为moreutils
的软件包,其中包含用于此目的的工具sponge
:
grep -v test foo.txt | sponge foo.txt
如果不能选择安装工具,您可以实现一个首先将所有数据读入内存的天真版本,然后最终将其写出来:
#!/bin/sh
sponge() (
var="$(cat; printf x)"
printf '%s' "${var%x}" > "$1"
)
grep -v test foo.txt | sponge foo.txt
答案 1 :(得分:1)
使用cat
可以轻松完成grep -v
和sed -i '/pattern/d'
尝试的操作,并允许在线保存更改:
sed -i.bak '/test/d' "$file"