如何用unix中的管道覆盖


1

所以我试图用管道覆盖:

    //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

Answers:


0

发生的事情是您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

您可能希望将a替换为;a,&&以便在命令失败或中止时不丢失原始文件。此外,该cat命令只是浪费时间做一个额外的副本。简单地重定向tr的输入,tr <cutTester.txt ...
2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.