bash:递归grep并替换字符串

时间:2017-04-18 22:30:07

标签: shell

我试图通过以下脚本替换当前目录中<Route component={P} path="p.html" routeName="p" />的所有文件中<Route component={L} path="'$variable_to_insert'" routeName="L"\/>之类的字符串的所有出现

VARIABLE_TO_INSERT=5


egrep -lR '<Route component={P} path="p.html" routeName="p" />' . | tr '\n' '\0' | xargs -0 -n1 sed -i '' 's/<Route component={L} path="'$variable_to_insert'" routeName="L"\/>/g'`

其中$variable_to_insert早先在shell脚本中定义

2 个答案:

答案 0 :(得分:1)

您可以使用find

进行简化
find . -maxdepth 1 -type f | xargs sed -i "s/<Route component={P} path=\"p.html\" routeName=\"p\" \/>/<Route component={L} path=\"$VARIABLE_TO_INSERT\" routeName=\"L\" \/>/g"
#                                            |                                                      | |                                                                   |
#                                            +-------------------- replace this --------------------+ +---------------------------- with this ----------------------------+

Shell变量只能在双引号字符串中替换,这就是我们正在进行sed -i "s/.../.../g"的原因。

请注意$VARIABLE_TO_INSERT的情况 - 变量名称区分大小写。

-maxdepth 1只抓取当前目录中的文件。您可以将其删除,以便对当前目录和所有子目录中的文件进行递归搜索。)

答案 1 :(得分:0)

使用$ VARIABLE_TO_INSERT而不是$ variable_to_insert,因为shell变量区分大小写。

此外,看起来你错过了s /// g第三个正斜杠。