使用 tr 命令

使用 tr 命令

假设该文件ft有 25 行文本。解释一下命令:

tail -15 ft | tr "a" "A" > ft

ft并告诉我命令执行后文件有多少行。

我知道这tail -15 ft将从文件中获取最后 15 行ft,并将tr 'a' 'A'任何内容更改aA.

但我不明白为什么> tr要删除文件中的所有内容。

答案1

发生的情况是,shell 首先设置重定向(在本例中为> ft),然后截断ft并打开它以进行写入;然后它设置管道的其余部分。tail -15 ft获取一个空文件并给出一个空结果,它tr处理不替换任何内容。ft结果是一个空文件。

答案2

您正在使用一个标准输出重定向并不是附加重定向输出 如果您尝试将输出附加到原始文件中,我不这么认为

man bash

重定向输出如果文件不存在则创建;如果它确实存在,则会被截断为零大小。

附加重定向输出以这种方式重定向输出会导致打开名称由单词扩展产生的文件,以便附加到文件描述符 n 上,或者如果未指定 n 则附加到标准输出(文件描述符 1)。如果该文件不存在,则会创建该文件。

因此,当您指定将输出重定向到同一个文件时,它将被截断并创建预期的输出

我建议做的是sedredirection

$ tail -15 ft | sed -e 's|a|A|g' > sed_output

答案3

您没有使用正确的 bash 表示法。

在 bash 中,您必须使用 '>file' 来覆盖文件并使用 '>>file' 来追加到该文件。相反,请使用“>>ft”。

相关内容