我正在尝试编写一个 shell 脚本,用 REPLACE 字符串替换当前目录(我的脚本所在的目录)所有文件中的 SEARCH 字符串。
我的条件是:脚本应该将除我的 shell 脚本之外的所有文件中的“搜索字符串”替换为“替换字符串”。
我在控制台中尝试了 sed 命令。它按我预期的方式工作。但是当我将此 sed 命令添加到我的脚本时,它会抛出一个错误。
我的脚本(replace.sh)中的命令是:
search_str=is;
replace_str=IS;
sed -i.bak s/$search_str/$replace_str/g !(replace.sh)
我收到的错误是:
./replace.sh: line 11: syntax error near unexpected token '('
./replace.sh: line 11: 'sed -i.bak s/$search_str/$replace_str/g !(replace.sh)'
希望你能帮助我。提前谢谢你。
答案1
你刚才需要启用extglob
在脚本中,至少在这一点上。
#!/bin/bash
search_str=is # Variable Initialization
replace_str=IS
# Other stuffs other 7 lines in your script
Old_State=$(shopt -p extglob) # Here you save the value of shopt extglob
shopt -s extglob # Here you change (if needed) that value
sed -i.bak s/$search_str/$replace_str/g !(replace.sh)
$Old_State # Here you restore the previous value of extglob
# Other code ...
我建议您保存并恢复 extglob 的状态,以防脚本很长,并且它有一些其他命令需要该选项的状态...当然,如果您正在编写自己的脚本,您可以决定使用它来编写它外接球 启用并与之保持一致:因此您只需shopt -s extglob
在该行之前添加脚本(#11)。
更多help shopt
来自 shell 的信息。
答案2
这是因为延伸模式类似功能!(replace.sh)
未启用。请将其添加shopt -s extglob
到您的脚本中。
答案3
在对你的问题进行了一些研究之后,我想我可能找到了解决方案
#!/bin/bash
search_str=is;
replace_str=IS;
find . -maxdepth 1 -type f ! -wholename $0 -exec sed -i s@$search_str@$replace_str@g {} \;
我已经使用 find-最大深度 1顶部将 sed 更改应用到脚本所在文件夹中的所有文件。 !-全名$0使脚本避免被自身使用
问候