如何替换目录及子目录下所有文件中的指定路径字符串
问题解决方法
原命令错误原因
find的-path参数是匹配文件的路径,而非文件内容,你需要找的是内容包含目标字符串的文件,这个参数完全不符合需求。sed -i无法直接处理管道传递的文件名,它需要将文件名作为命令行参数传入,管道默认是把文本内容传给sed,而非文件名列表。
满足需求的命令
1. 搜索包含目标字符串的文件
使用grep递归搜索并仅输出符合条件的文件名:
grep -rl "/home/nxaXXXXX/simulation/MSIP/DPGA/" /home/nxfXXXXX/TestCases/
参数说明:
-r:递归遍历子目录-l:仅输出包含匹配内容的文件名
2. 批量替换文件内容
结合grep和while循环实现批量替换(无需-exec):
grep -rl "/home/nxaXXXXX/simulation/MSIP/DPGA/" /home/nxfXXXXX/TestCases/ | while read -r file; do sed -i 's@/home/nxaXXXXX/simulation/MSIP/DPGA/@/home/nxfXXXXX/TestCases/@g' "$file" done
这个命令会先找出所有包含目标字符串的文件,再逐个用sed替换其中的指定字符串。
注意:如果你的
sed版本不支持-i,可以改用临时文件中转:grep -rl "/home/nxaXXXXX/simulation/MSIP/DPGA/" /home/nxfXXXXX/TestCases/ | while read -r file; do sed 's@/home/nxaXXXXX/simulation/MSIP/DPGA/@/home/nxfXXXXX/TestCases/@g' "$file" > "$file.tmp" && mv "$file.tmp" "$file" done
内容的提问来源于stack exchange,提问作者Ricardo Silvestre
相关产品推荐
相关产品推荐

