sed命令在bash脚本中抛出错误

时间:2018-03-13 13:51:52

标签: bash shell sh ubuntu-16.04

我有一个简单的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

2 个答案:

答案 0 :(得分:2)

我不会为此使用sed。我会用ed:

ed "$file" <<END
1i
$Msg
.
wq
END

或者,使用moreutils包中的sponge

{ echo "$Msg"; cat "$file"; } | sponge "$file"

答案 1 :(得分:0)

您可以使用这样的marge来完成此操作,这里使用echo "$Msg" > tmp.txt 创建一个文件,其中$Msg作为tmp文件的标头。使用cat $file >> tmp.txt您正在合并文件。

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
     echo "$Msg" > tmp.txt
     cat "$file" >> tmp.txt
     mv tmp.txt "$file"
   fi
 fi
done

希望这会对你有所帮助。