0

我正在尝试在 sed 中编辑一个我一直遇到问题的简单字符串。基本上我要做的是使用 pwd 获取我当前的工作目录,将其通过管道传输到 sed,编辑文件路径,然后使用 ls 检查文件路径内容。我需要这样做的原因是动态检查备份以查看备份是否包含我当前正在使用的文件夹中的文件(只是将其设置为快速热键)。

这是我到目前为止所得到的:

    pwd | sed "s/`whoami`/`whoami`.{daily,weekly,monthly}/g" | xargs ls

在我的服务器上运行它时(它是一个共享托管服务器,因此需要whoami而不仅仅是用户名)我得到这个错误:

    /bin/ls: cannot access /home1/username.{daily,weekly,monthly}: No such file or directory

但是,我可以毫无问题地运行此命令:

    ls /home1/username.{daily,weekly,monthly}

我已经尝试了大约 20 种该命令的不同变体(以及各种 sed 和 xargs 标志),但似乎无法使其正常工作。我相信这个错误是由 sed 处理搜索和替换流的方式引起的,但是我不知道如何解决它或导致它的确切原因。

我相信是 sed 导致了这个问题,因为这个命令有同样的错误:

    ls `pwd | sed "s/$(whoami)/$(whoami).{daily,weekly,monthly}/g"`
    /bin/ls: cannot access /home1/username.{daily,weekly,monthly}: No such file or directory

如果有人能告诉我为什么会这样,或者 sed 以某种方式将编辑后的版本正确传递给 ls。我应该能够为它找出一个命令,我只需要知道为什么。谢谢!

4

2 回答 2

2

{daily,weekly,monthly}字符串由 解释bash,但 bash 看不到该字符串:它直接从sedtoxargs和传递ls

为了bash有机会扩展字符串,也许可以尝试:

eval ls $(pwd | sed "s/`whoami`/`whoami`.{daily,weekly,monthly}/g")
于 2013-02-19T02:18:12.050 回答
0

bash展开大括号,所以

ls /home1/username.{daily,weekly,monthly}

实际上被执行为

ls /home1/username.daily /home1/username.weekly /home1/username.monthly

名为的目录/home1/username.{daily,weekly,monthly}不存在。xargs只会传递它从字面上接收到的任何东西,绕过大bash括号扩展。

看到这个:

echo a{b,c}d
>>> abd acd

echo "a{b,c}d" | xargs echo
>>> a{b,c}d

所以你的问题不在于sed, 也不ls。您需要找到一种手动进行扩展的方法。最简单的方法是使用eval(编辑:如 Adrian Pronk 所示)

于 2013-02-19T02:13:12.240 回答