关于 sed 和 '>' 的混淆

mat*_*ots 6 bash pipe sed

以下命令工作正常:

sed s/input/raw_input/ p.py >p2.py && mv p2.py p.py
Run Code Online (Sandbox Code Playgroud)

但是,以下命令会将 p.py 转换为空文件:

sed s/input/raw_input/ p.py >p.py
Run Code Online (Sandbox Code Playgroud)

下面的代码也将 p.py 变成了一个空文件:

sed s/input/raw_input/ p.py | cat > p.py
Run Code Online (Sandbox Code Playgroud)

为什么最后两个命令没有按预期运行?特别是为什么 p.py 是空的?

Sie*_*geX 11

这是因为重定向运算符>在任何命令之前被调用,因此以下顺序发生:

  1. p.py 为写入而打开,截断之前存在的任何内容
  2. sed被调用来执行p.py现在为空的命令
  3. 输出(什么都没有)被写入p.py(所以它仍然不包含任何内容)

根据您希望代码的可移植性,您有两种选择:

不便携

使用 GNUsed -i选项进行就地编辑

便携的

将输出重定向到临时文件,然后在sed完成后将临时文件移到原始文件上

  • @KeithThompson 是的,shell 对此进行了很好的定义。不确定*丑陋的命令* 是什么意思,重定向到文件是一种常见且非丑陋的做法。 (3认同)