如何删除shell脚本文件中的特定if语句,并对单个文件夹中所有文件夹的所有文件执行相同的操作



如何删除shell脚本文件(例如 file.sh)中的特定if语句,并使用for循环对单个文件夹中所有文件夹的所有文件(file.sh)执行相同的操作以查找该文件?

详细说明:

我有一个文件夹 A。它里面有各种文件夹,假设B,C,D,E...等。B,C,D,E的所有/部分文件夹...etc有两个文件,file1.sh 和 file2.sh。这两个文件,file1.sh 和 file2.sh 有一个 if 语句。

if [ $usertype != "adm" ]
then
    echo "deploy can only be run with dtp?adm account."
    exit 1
fi

我想编写一个脚本,它将文件夹 A 作为参数,检查文件、file1.sh 并在其每个子文件夹 B、C、D、E... 等内 file2.sh。如果找到这些文件,它将检查上面的if语句,如果存在,它应该从iffi删除这个完整的if语句,保存文件并退出。

假设给定的文件夹是当前目录,. ,那么您可以使用:

find . -type f -name '*.sh' -exec 
    sed -i.bak '/if [ $usertype != "adm" ]/,/fi/d' {} +

这假设测试在任何其他情况下都不会出现,并且只是删除if和下一个fi之间的线条。 备份文件以防万一出现问题。 它查找给定目录下的所有.sh文件。 结尾的+在现代版本的find中工作,实际上很像xargs。 如果您的find不支持+,有一些解决方法;最简单的方法是使用 ;';' 代替+,但这意味着sed将为每个文件执行一次,而不是对许多文件执行一次。

如果需要更多检查,因此需要匹配thenechoexit,那么我可能会切换到 Perl 并使用"段落"阅读模式以多行块读取文件,并仅在与整个文本块匹配时才删除块。

我不能发表评论,所以我尝试这样: 也许删除 if 语句是不必要的,使用 sed/awk 将 if 语句更改为始终为 false 的条件,例如:

if [ "a" == "b" ] # if [ $usertype != "adm" ]
then
...
fi

使用 sed/awk 替换整行的示例:

bash:替换文本文件中的整行

使用 awk 更改线条

我现在

使用 SED 命令编写了一个简单的 shell 脚本。感谢托马斯的建议。

 for file in `find $1 -type f -name "deploy*.sh" -print 2>/dev/null`
do
echo "File checked : $file"
sed 's/$usertype/adm/g' $file > $file.new
mv $file.new $file
done

它按预期对我有用。请注意,每个包含 $usertype 的 deploy*.sh 文件中只有一个 if 条件。

因此,如果在脚本执行后条件变为这样,

if [ adm != "adm" ] 
    then
    ...
fi

因此,控件永远不会进入 if 循环。感谢大家的帮助

相关内容

  • 没有找到相关文章

最新更新