2014-04-22 56 views
0

假设你想读的输入文件“password.txt的”,更改 每一个大写字母为小写字母和每一个“$”,以一个“#”, 然后将结果保存回到相同的文件(覆盖它)。如何 你会用tr命令来做到这一点?提示:使用管道和文件 重定向。Unix的管道和重定向

我试过这两个命令,但它们没有工作。我认为这个文件被系统截断了,所以passwords.txt在之后变空了。

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

tr'[AZ'!']''

我知道我们可以做类似的东西写入到一个临时文件,并使用“& &”更改临时文件名password.txt的。然而,这是一个家庭作业问题,我们还没有学到“& &”,所以我相信只有通过管道和重定向才能做到这一点。

回答

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 

然后命令2时被执行,且仅当在command1成功是command1返回零退出状态,即。

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:~#