假设您要将文件'passwords.txt'作为输入读取,请更改 每个大写字母到小写字母,每个'$'到'#', 然后将结果保存回同一个文件(覆盖它)。怎么样 你会用tr命令吗?提示:使用管道和文件 重定向。
我尝试了这两个命令,但它们没有用。我认为该文件被系统截断,因此在。之后,passwords.txt变为空。
cat passwords.txt | tr' [A-Z'!']' ' [A-Z'#']'
tr'[A-Z"!"]''[a-z"#"]'< passwords.txt> passwords.txt
我知道我们可以将其写入临时文件并使用"&&"将临时文件名更改为passwords.txt。然而,这是一个家庭作业问题,我们无法了解"&&"但是,我相信只有管道和重定向必须有另一种方法来做到这一点。
答案 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:~#