因此我尝试使用管道覆盖:
//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