【发布时间】:2024-01-02 09:13:02
【问题描述】:
我有一个简单的 Bash shell 脚本来遍历目录中的每个文件,并检查版权信息是否位于文件顶部。 如果没有,应该添加它。
当我尝试在 sed 命令中使用变量时,脚本出错。我查看了其他类似的问题并尝试了双引号“”,我尝试使用不同的运算符但仍然找不到解决方案。有人可以指出我做错了什么吗?
Msg='/*------------------------------------------------------------------------------
*******************************************************************************
* Copyright message here
*******************************************************************************
*----------------------------------------------------------------------------*/'
for file in *
do
if grep -Fxq "$Msg" $file
then
echo Marvel Message already exist: $file
else
if test -f "$file"
then
echo "Adding Message to file: $file"
sed -i "1s/^/${Msg}\n/" $file
fi
fi
done
【问题讨论】:
-
您需要使用不包含在变量中的分隔符,即不是
/ -
我已尝试将分隔符设置为
|,就像在sed -i "1s|^|${Msg}\n|" $file中一样,但仍然存在问题 -
看看sed replace with variable with multiple lines。在那里你看到你应该用
sed -i "1s/^/${Msg//$'\n'/\\n}\n/" $file替换你的sed行 -
不,不,不,不。根本不要为此使用 sed。只需这样做:
{ echo "$Msg"; cat "$file"; } > $file.tmp; mv $file.tmp $file如果您愿意,可以添加一些用于清理的陷阱,不要再自欺欺人地认为sed -i会神奇地保护您免于意外将 tmp 文件留在文件系统上。
标签: bash shell sh ubuntu-16.04