如何在 sh 中从 xargs 扩展单引号波浪号?

如何在 sh 中从 xargs 扩展单引号波浪号?

我有一个存储在文件中的文件列表,我想对每个文件进行 grep 查找搜索词。

但是,xargs将参数作为单引号字符串转发,因此对于所有以 为前缀的文件~,我都会收到No such file or directory错误,因为~' 未扩展。

这是我正在运行的命令:cat search-files | xargs -n 1 grep 'search-term'

search-files除了自己实际进入并更改路径之外,我怎样才能解决这个问题?

答案1

但是您可能会遇到其他问题:如果搜索文件包含行*or该怎么办$(rm important-file)

扩展@steeldriver的提示:

sed "s,^~,$HOME," search-files | xargs -n 1 grep 'search-term'

答案2

好吧,我想通了A解决方案,但我不太确定它为什么有效。

如果插入xargs -i sh -c 'echo {}',波形符会扩展。

整个命令如下所示:

cat search-files | xargs -i sh -c 'echo {}' | xargs -n 1 grep 'search-term'

编辑:好的,这就是它的工作原理: 当执行命令时,用单引号xargs将每个[command]和括起来。[initial-args]所以,与原来的命令一样,grep{}被单独单引号括起来。然而,通过做sh -c 'echo {}',我们力echo{}成一样[initial-arg]。这允许sh正常地进行波形扩展。如果我们没有单引号'echo {}',这将不起作用。

相关内容