如何在unix中使用管道覆盖

如何在unix中使用管道覆盖

因此我尝试使用管道覆盖:

    //reads contents of file| turns lowercase to uppercase | changes $ to # |
    // then attempts to overwrite original file with new version
    cat cutTester.txt|tr '[a-z]' '[A-Z]'|tr '$' '#' >cutTester.txt

但当我这样做时,它只会擦除文件。这是文件的内容

    $first$second$third$fourth
    $fifth$sixth$seventh$eighth
    $ninth$tenth$eleventh$twelveth
    $thirteenth$fourthteenth$fifthteenth$sixthteenth
    $seventeenth$eightteenth$nineteenth$twenty
    $twenty-one$twenty-two$twenty-three$twenty-four

答案1

实际情况是,您cutTester.txt使用“ >”重定向符号进行截断。然后,您将tr在空输入文件的重定向输出上处理命令。

请注意,下列操作也会截断文件:

$ cat cutTester.txt > cutTester.txt

尤其是如果您是一名开发人员,您可能习惯于编写类似这样的语句x=`eval $x + 1`,其中eval先求值表达式,然后再赋值。但是,重定向运算符的行为并不类似。考虑一下,将文件的输出重定向回自身的实现很可能需要 shell 在后台创建临时文件,并且不像简单地重新分配变量(仅存在于内存中)那样简单或高效。

幸运的是,自己明确地创建一个临时文件非常简单:

#!/bin/bash

# reads contents of file| turns lowercase to uppercase | changes $ to # |
# then attempts to override original file with new version

cat cutTester.txt | tr '[a-z]' '[A-Z]' | tr '$' '#' > cutTester.tmp; mv cutTester.tmp cutTester.txt

相关内容