一、演示
自制自用-终端使用命令,查找关键字,并打印笔记大纲
二、功能
脚本主要功能:
- 根据关键字,输出所有分支
延伸功能:
- 按需设置输出行数
- 搜索关键词高亮
- 精确匹配/模糊匹配
三、过程
最近开始学习,看网课时写了很多思维导图,但是在实际使用时,需要频繁打开思维导图查看,不是很方便
于是想仿照–help之类的命令,在终端使用命令查看自己的思维导图
首先是要能读取思维导图,后来发现幕布可以将思维导图转化为大纲笔记模式:
然后导出为docx,再批量转成txt格式 (因为读取docx格式的文件,需要安装别的东西)
libreoffice --headless --convert-to txt /home/qwe/下载/*.docx --outdir /home/qwe/桌面/script/lib
可以读取之后,就是想办法输出关键词所在节点的分支
采取的办法是:获取每一行开头的空格数,空格数越大说明是子节点,可以输出
#!/bin/bash
# 接收参数:参数1:待查询关键词 参数2:最大输出行数
key=${1:-' '}
maxlines=${2:-100}
if [[ $key == ' ' ]];then
echo "参数1:查询关键词(必填)"
echo "参数2:最大输出行数(默认为100):从查找到关键词的行,继续往下输出的行数(需满足是分支)"
exit
fi
# echo "查询关键词:${key}"
# echo "最大输出行数:${maxlines}" #从查找到关键词的行,继续往下输出的行数(需满足是分支)
# 若无下行代码,行内文本的缩进和空格将会丢失。
IFS=$'\n'
flag=0 # 为1,开始输出分支
start_count=0 # 起始行 空格个数
cur_count=0 # 空格个数
src=0 #未输出过文件名
dir="/home/qwe/桌面/script/lib/"
ls $dir | while read srcfile # 文件
do
let src=0
for line in `cat ${
dir}${
srcfile}` # 每行
do
if [ $flag -gt 0 ]
then # 若是分支,返回包含关键字的分支
# 判断此行空格是否大于start_count
let cur_count=0 # 空格个数
for i in `seq 1 ${
#line}` # 每个字符
do
a=`echo $line | cut -c $i`
case $a in
' ')
let cur_count+=1
;;
# ● )
*)
break
;;
esac
done
# echo "cur_count:${cur_count} --$line"
# 如果没有空格,就输出!待更新
if [ $cur_count -eq 0 ]
then
echo $line | perl -pe "s/${key}/\e[1;31m$&\e[0m/g"
elif [ $cur_count -gt $start_count ]
then
echo $line | perl -pe "s/${key}/\e[1;31m$&\e[0m/g"
let cur_count=0
let flag-=1
if [ $flag -eq 0 ];then
let start_count=0 # 起始行 空格个数
let cur_count=0 # 空格个数
echo "---------------------------------------------------------"
fi
else
let flag=0 # 为1,开始输出分支
let start_count=0 # 起始行 空格个数
let cur_count=0 # 空格个数
echo "---------------------------------------------------------"
# 本以为是分支,但其实不是,又没法进入elif判断,所以这里要添加判断
if [[ $line =~ $key ]] # 包含关键字
then # 返回包含关键字的分支
let flag=${maxlines}
echo $line | perl -pe "s/${key}/\e[1;31m$&\e[0m/g"
for i in `seq 1 ${
#line}`
do
a=`echo $line | cut -c $i`
case $a in
' ')
let start_count+=1
;;
*)
break
;;
esac
done
# echo "start_count:$start_count"
fi
fi
elif [[ $line =~ $key ]] # 包含关键字
then # 返回包含关键字的分支
# 可能不是要找的,比如cpp
let flag=${maxlines}
if [[ $src == 0 ]]
then
let src=1
echo " "
echo "======================= "$srcfile" ======================="
fi
echo $line | perl -pe "s/${key}/\e[1;31m$&\e[0m/g"
let start_count=0 # 起始行 空格个数
for i in `seq 1 ${
#line}`
do
a=`echo $line | cut -c $i`
case $a in
' ')
let start_count+=1
;;
*)
break
;;
esac
done
# echo "start_count:$start_count"
fi
done
done
代码写好后,需要把它设置个alias别名,不然每次使用太麻烦
gedit ~/.zshrc
qwe /home/qwe/桌面/script/qwe.sh
source ~/.zshrc
然后就可以使用命令
qwe #查看命令
qwe rm # 参数1:查询关键词(必填)
qwe rm 3 #参数2:最大输出行数(默认为100):从查找到关键词的行,继续往下输出的行数(需满足是分支)
四、收获
${var-初始值} 如果没有定义,则表达式返回默认值
没有定义或者为空字符串,则表达式返回默认值
${var:-初始值} 临时调用,变量var并不改变,仍然为空
${var:=初始值} 调用初始值后,变量var也赋予了一个值
传=${1:-'1.0.0'}
参=${2:-'test demo'}
$( ) 与` ` (反引号) 都可用做命令替换用
用于 ∗ ∗ 变量替换 ∗ ∗ 。一般情况下, { }用于**变量替换**。一般情况下, 用于∗∗变量替换∗∗。一般情况下,var 与${var} 并没有什么不一样
[ ] 和 []和 []和(())是一样的,都是进行数学运算的。
(( ))及[[ ]] 分别是[ ]的针对数学比较表达式和字符串表达式的加强版。
2.case in
3.if else
4.高亮
echo \$line | perl -pe "s/\${key}/\e[1;31m$&\e[0m/g"
6.IFS
7.录屏
8.获取每行空格数
let start_count=0 # 起始行 空格个数
for i in `seq 1 ${
#line}`
do
a=`echo $line | cut -c $i`
case $a in
' ')
let start_count+=1
;;
*)
break
;;
esac
done
# echo "start_count:$start_count"
9.doc转txt
libreoffice --headless --convert-to txt /home/qwe/下载/*.docx --outdir /home/qwe/桌面/script/lib
五、问题
关键词匹配,没办法精确匹配、模糊匹配
比如想要cp,却打印了cpp
比如只记得删除文件夹,却没办法匹配删除指定文件夹