我正在尝试创建一个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
我该怎么做?
答案 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