Unix管道和重定向

时间:2014-04-22 07:13:13

标签: unix redirect tr piping

  

假设您要将文件'passwords.txt'作为输入读取,请更改   每个大写字母到小写字母,每个'$'到'#',   然后将结果保存回同一个文件(覆盖它)。怎么样   你会用tr命令吗?提示:使用管道和文件   重定向。

我尝试了这两个命令,但它们没有用。我认为该文件被系统截断,因此在。之后,passwords.txt变为空。

  

cat passwords.txt | tr' [A-Z'!']' ' [A-Z'#']'

     

tr'[A-Z"!"]''[a-z"#"]'< passwords.txt> passwords.txt

我知道我们可以将其写入临时文件并使用"&&"将临时文件名更改为passwords.txt。然而,这是一个家庭作业问题,我们无法了解"&&"但是,我相信只有管道和重定向必须有另一种方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

  

我认为文件被系统截断了,所以   在。之后,passwords.txt变空。

你是对的。您需要将tr输出重定向到临时文件,并将临时文件移动到原始文件。

此外,使用!周围的引号(我假设它原来是$)和#是多余的。你可以说:

cat /etc/passwd | tr 'A-Z$' 'a-z#' > temp && mv temp /etc/passwd

或使用间接消除无用的cat

tr 'A-Z$' 'a-z#' < /etc/passwd > temp && mv temp /etc/passwd

这里&&是一个分隔两个命令的控制操作符。如果你说:

command1 && command2

然后,当且仅当command1返回退出状态为零时,即command1成功时,才执行command2。

答案 1 :(得分:1)

以下是不使用&&

的另一种方法
echo "$(tr '[A-Z$]' '[a-z#]' < sample)" > sample

<强>测试

sat:~# cat > sample
sample TEXT
$test
sat:~# 
sat:~# echo "$(tr '[A-Z$]' '[a-z#]' < sample)" > sample
sat:~# cat sample
sample text
#test
sat:~#