如何捕获文件并使用相同的名称创建新文件而不创建新的文件Unix Korn shell

时间:2018-01-24 18:34:33

标签: shell unix cat createfile

有一种方法来捕获文件,按某种方式对其进行过滤,然后输出一个具有相同名称的新文件?我这样做,我得到一个空文件,但如果我用不同的文件名创建它是有效的。我不想创建新文件。

示例:

File="My_test_file.txt"
cat ${File} | grep -v "test" > ${File}

以这种方式不起作用,我必须创建另一个文件才能使其正常工作,如下所示:

File="My_test_file.txt"
cat ${File} | grep -v "test" > ${File}.tmp

任何想法?

2 个答案:

答案 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 -vsed -i '/pattern/d'尝试的操作,并允许在线保存更改:

sed -i.bak '/test/d' "$file"