sed命令在MAC和Linux下的不同使用方式


sed命令在MAC下使用出现sed: 1: "Readme.md": invalid command code R的解决方法

Linux命令:

echo 输入更新内容:
read m
echo 更新readme中.......
sed -i "2 i #### $(date '+%Y-%m-%d %H:%M:%S %A') \n $m" Readme.md

如果此命令在MAC下输入,会报错:

sed: extra characters after \ at the end of a command

MAC命令:

echo 输入更新内容:
read m
echo 更新Readme中.......
sed -i '' "1a\\
####  `date '+%Y-%m-%d %H:%M:%S %A'` \\
$m
" Readme.md

在某行的前面添加,只需要把’a’换成’i’即可。

此命令不会在原文件上进行更改,只是会把结果输出到termimal里,如果需要直接更改文件,需要参数 -i

问题一:-i参数的问题

问题描述:sed编辑命令:sed -i 's/a/b/g' test.txt
报错:sed: 1: "test.txt": undefined label 'est.txt'
解决方案:sed -i '' 's/a/b/g' test.txt-i后面加上一对''
原因:-i参数是强制替换原有文件,但是mac强制要求备份,否则报错,这个在Mac上系统会有问题,否则-i参数无法使用,请注意。

问题二:匹配a追加内容问题

问题描述:sed追加命令:sed -i '' "/a/a\xxx" test.txt匹配到a字符后追加xxx内容
报错:sed: 1: "/a/a\xxx": extra characters after \ at the end of a command
解决方案:在追加内容前换行,且要用双斜杠\

sed -i '' "/a/a\\
xxx \\
" test.txt

备注:/i操作同理

判断操作系统

判断操作系统来执行相应的脚本,比如sed命令在Linux和MacOS下不同,这时候可以使用uname -s来进行判断然后执行相应的语句

#!/bin/sh
echo 请输入更新内容:
read m
echo 更新日志中...
System=$(uname -s)
if [ $System == "Darwin" ]; then
    echo "Use MacOS"
    sed -i '' "1a\\
    ####  $(date '+%Y-%m-%d %H:%M:%S %A') \\
$m
" ChangeLog.md
elif [ $System == "Linux" ]; then
    echo "Use Linux"
    sed -i "2 i #### $(date '+%Y-%m-%d %H:%M:%S %A') \n $m" ChangeLog.md
else
    echo "Other OS: $System"
fi
git add .
git commit -m $m
gitRemote=$(git remote)
git push $gitRemote

其他

流程控制添加多项选择,根据选择内容来执行制定脚本

#!/bin/sh 
echo "1. first" 
echo "2. second"
echo "3. third"
read -p "Please choose your country: " i
case "$i" in
1)
echo "Your country is China."
;;
2)
echo "Your country is USA."
;;
3)
echo "Your country is England."
;;
*)
echo "Please choose a right item."
esac

文章作者: 张登友
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张登友 !
  目录