在包含 $HOME 的列表中的所有文件中搜索一个单词

Grep a word within all files in a list that contains $HOME

我正在尝试对 list.txt 中的所有文件进行 grep 查询。

list.txt:

$HOME/a.txt
$HOME/b.txt
$HOME/c.txt

当我使用

grep -i 'word' $(cat list.txt)

它没有意识到$HOME。但是下面的命令有效!

grep 'word' $HOME/a.txt

你需要一点来自envsubst的魔法:

$ grep word $(cat list.txt | envsubst)
...
  • 使用envsubst$HOME替换为实际的目录名(假设不包含空格)
  • 在将 envsubst 的标准输出上的文件名列表拆分为传递给 grep[=18= 的命令行参数时,使用 xargs 支持引号和反斜杠(因此仍然可以表示带空格的文件名) ]
envsubst <file.txt | xargs grep -e word

这看起来像 bash 和 ksh 问题,所以我会相应地回答。

发生的事情是 $HOME 由 shell 解释,而不是 grep。在将 $HOME 传递给 grep 之前,您需要对其进行解释。 eval 关键字可以像这样为您做到这一点:

for file in $(cat test.txt )
do
    eval "grep 'word' $file"
done

如果直接使用 cat,生成的字符串包含换行符。为避免这种情况,我将文件放入一个数组中并使用该数组(< 可以用来代替 cat)。这也有效:

typeset -a test=( $( < test.txt ) )
eval "grep word ${test[@]}"