在包含 $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[@]}"
我正在尝试对 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[@]}"