【发布时间】:2017-04-13 23:38:39
【问题描述】:
上一个主题 - https://stackoverflow.com/questions/40808975/overwrite-script-in-bash-shell
我正在从事一个大学项目,我们必须创建一个带有删除和恢复选项的回收站。我已经完成了这两个部分并且恢复选项工作(大部分)。它将已删除文件的位置保存在名为 FilePaths 的 txt 文件中,以在将文件恢复到其原始位置时用作参考。
我知道当一个文件位置的副本保存到这个文件中时会导致问题,所以我必须在 bash 脚本中创建一行,从文本文件中删除特定的文件位置字符串。
我知道 sed 可以提供帮助,我可以操纵它来做任何我想做的事情,但问题是它似乎根本没有做任何事情。我什至用一个简单的“test2”文本文件对它进行了测试,里面有 hello 这个词。
sed '/hello/d' test2
这绝对没有任何作用。我已经用双引号试过了,但仍然没有,它根本没有从我的 test2 文件中删除“hello”
就恢复功能而言,这是我目前所拥有的
#!/bin/sh
#navigate to the Recycle_Bin directory
cd $HOME/Recycle_Bin
#take the string from FilePaths and save it to restore
restore="$(grep "$1" "$HOME/FilePaths")"
#take the string saved in restore and use it as the file's path
filename="$(basename "$restore")"
#remove the string matching restore within FilePaths
sed '/$restore/d' $Home/FilePaths
#set location
location="$(readlink -f "$location")"
#move file to original location
mv -i "$1" "$(grep "$1" "$HOME/FilePaths")"
谁能想到 sed 不起作用的任何原因?我一直在寻找几个小时,但找不到任何答案,我可以使用 awk 但我觉得 sed 会使我的代码更简单
【问题讨论】:
-
你真的检查过
sed '/hello/d' test2的输出吗?它是否仍然包含带有hello的行(输出,而不是文件)?如果有,你可以试试echo "hello" | sed '/hello/d'吗?它应该什么也不输出。 -
至少,正如 JNevill 的回答所评论的那样,一个简单的解决方法是,您应该在引用
sed变量的sed命令周围使用双引号,否则它不会被扩展。 -
所以我把它写成
sed -i "/"$restore"/d" $HOME/FilePaths -
这里引用太多了,就
sed -i "/$restore/d" $HOME/FilePaths。双引号和单引号共享一些效果(它们将其内容标记为单个字段),但双引号要求 shell 检查字符串并在适当时扩展其内容,而单引号仅包含从 shell 角度来看的文本 -
当你确认你没有很好的
/.../命令时,有两个选项可供你使用:要么在将$restore变量中的每个/转义,然后将其传递给@ 987654334@,或者在sed中使用另一个分隔符,你肯定不会在你的$restore变量中找到它(尽管/.../是常态,可以使用任何分隔符:我经常使用+...+或@ 987654339@ 当我处理很多/)