我正在尝试在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如何处理搜索和替换为流引起的,但是我不知道如何绕过它或者完全是什么导致它。
我认为这导致了问题,因为此命令具有相同的错误:
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。我应该能够找到它的命令,我只需要知道原因。谢谢!
答案 0 :(得分:2)
{daily,weekly,monthly}
字符串由bash
解释,但是bash没有看到此字符串:它直接从sed
传递到xargs
和ls
。
要为bash
提供扩展字符串的机会,请尝试:
eval ls $(pwd | sed "s/`whoami`/`whoami`.{daily,weekly,monthly}/g")
答案 1 :(得分: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所示)