学习助手开发4——实现完成事项的功能
项目地址: https://github.com/Zeraka/mytodolisthelper
todolist里的计划完成,需要将notdone,替换为done
初步思路是设计一个脚本,该脚本将具体某一行的notdone字符串替换为done字符串。
首先是要知道每行事务的行数。指令使用 grep -n
即可。可得到如下消息
12:类继承 2020-09-22 12:07:22 notdone
13:类继承 2020-09-22 18:07:22 notdone
14:16进制转换10进制和字符串相乘 2020-09-22 18:37:17 notdone
现在需要将第12行中的notdone修改为done,请问怎么办?
sed实现将某行文字替换
使用sed命令,将第12行的notdone替换为done。
参考该文档的指令。https://www.cnblogs.com/YLuluuu/p/9258782.html
直接在命令行终端为:
sed -i '12 s/notdone/done/' todolist.txt
i是表示就地修改文件。 12表示修改12行, 后面的指令是将notdone字符串替换为done字符串。
这里有一个引号的问题. 报错sed: -e expression #1,
最后这样解决——直接使用双引号,以及在原先的s/notdone/$2后加上/g.主要是加上了/g解决了问题。
#!/bin/sh
filename='todolist.txt'
sed -i "$1 s/notdone/$2/g" $filename
单引号就是所见即所得,双引号就是会输出所有的内容,如果里面有变量,会展现变量。
参考该连接 https://blog.csdn.net/qq_25035099/article/details/79642261
加入条件判断
该脚本需要进一步完善,比如判断是否包含系统参数。
shell中默认变量$#说明脚本参数的个数。
shell的条件语句写法为:
if[xxx];then
xxxxx
else
xxxx
fi
shell中的循环语句:
while []
do
xxxx
done
在使用条件语句的时候,发现总是报not found的错误。
#!/bin/bash
filename='todolist.txt'
if [$#!=0]
then
sed -i "$1 s/notdone/$2/g " $filename
fi
echo sed -i "$1 s/notdone/$2/g" $filename
报错为./donesth.sh: 4: ./donesth.sh: [1==0]: not found
.
查了以下,shell中用if报not found错误是较为典型的。
网上有一种解决方法: 在写if条件的时候if空格[空格$#==0空格]
,也就是说if后,[
和]
的两侧都得是空格,这样才能够正确识别。
原因我猜测是shell是通过将每行的文本读取后按照空格分割的,如果是单独的if ,[``]
这些,它就能够识别出是有独特意义的,否则只会被当作普通字符串的一部分。
最后成功了
#!/bin/bash
filename='todolist.txt'
if [ $# != 0 ] #这里要注意,所有运算符,包括!=也要隔开。
then
sed -i "$1 s/notdone/$2/g " $filename
fi
echo sed -i "$1 s/notdone/$2/g" $filename
什么是dash
此外,发现ubuntu执行脚本的软连接并不是指向sh或者bash
ll /bin/sh
得到
lrwxrwxrwx 1 root root 4 Apr 16 23:52 /bin/sh -> dash*
dash和bash一样,是linux的shell的一种。
sh是最基础的,而bash十分强大,dash是debian系默认用的shell。dash比bash要小,可能会存在一些其他的兼容问题。
尽量在脚本中使用bash.
bash和dash的区别 https://blog.csdn.net/weixin_39212776/article/details/81079727
其他的问题
sed还有哪些参数?
如果用python实现,该如何实现?
https://www.cnblogs.com/lonecloud/p/9066199.html