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

时间:2015-04-29 17:23:32

标签: arrays bash shell sed zsh

我正在尝试创建一个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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

我没有尝试解析文件列表(当文件名中有空格或换行符时可能会出现问题),而是使用find及其-exec执行整个操作。过滤器:

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

诀窍是

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

这对于包含sed -i "s/$input_string/$replace_value/"的当前目录下的常规文件运行protal

答案 1 :(得分:0)

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