如何获取递归 grep 的输出并将其拆分为类似变量的数组?

How do I take the output of recursive grep and split it into an array like variable?

我正在尝试创建一个 shell 搜索和替换函数来替换目录中出现的所有字符串。问题是我如何获取递归 grep 的输出并使用它来查找要用于 sed 的文件?

我有以下管道 grep -R protal ./ | sed 's/:.*//g' | sed 's/\/\//\//g'。它产生这个输出:

./settings.py
./settings.py
./settings.py
./urls.py
./wsgi.py
./wsgi.py

我想把它分成一个数组或其他东西,这样我就可以做(伪代码):

for [[ $file in $file_list ]]; do
   sed -i 's/$input_string/$replace_value/g' $file
done

我该怎么做?

for file in $(grep -R protal ./ | sed 's/:.*//g' | sed 's/\/\//\//g'); do
#yourcode
done

只需使用 xargs :

grep -R protal ./ | sed 's/:.*//g' | sed 's/\/\//\//g' | xargs  sed -i 's/$input_string/$replace_value/g'

我不会尝试解析文件列表(当文件名中有空格或换行符时可能会出现问题),我会用 find 及其 -exec 来完成整个过程过滤器:

find . -type f -exec grep -q protal '{}' \; -exec sed -i "s/$input_string/$replace_value/" '{}' \;

诀窍在于

  • 仅当命令 returns 退出状态为 0
  • 时,-exec 过滤器才会通过
  • 仅当 file.txt 包含 protalgrep -q protal file.txt returns 具有退出状态 0,并且
  • 第二个 -exec 过滤器,因为它链接在第一个过滤器之后,只有在第一个过滤器通过时才会尝试(并且只执行关联的命令)。

对于当前目录下包含 protal.

的常规文件,这具有 运行 sed -i "s/$input_string/$replace_value/" 的效果