如何获取递归 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
包含 protal
时 grep -q protal file.txt
returns 具有退出状态 0
,并且
- 第二个
-exec
过滤器,因为它链接在第一个过滤器之后,只有在第一个过滤器通过时才会尝试(并且只执行关联的命令)。
对于当前目录下包含 protal
.
的常规文件,这具有 运行 sed -i "s/$input_string/$replace_value/"
的效果
我正在尝试创建一个 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
、 时, - 仅当
file.txt
包含protal
时grep -q protal file.txt
returns 具有退出状态0
,并且 - 第二个
-exec
过滤器,因为它链接在第一个过滤器之后,只有在第一个过滤器通过时才会尝试(并且只执行关联的命令)。
-exec
过滤器才会通过
对于当前目录下包含 protal
.
sed -i "s/$input_string/$replace_value/"
的效果