sed 命令在控制台中有效;但在 shell 脚本中它会抛出错误

sed 命令在控制台中有效;但在 shell 脚本中它会抛出错误

我正在尝试编写一个 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使脚本避免被自身使用

问候

相关内容