【自制自用-记录一下】终端使用命令查看思维导图

一、演示

自制自用-终端使用命令,查找关键字,并打印笔记大纲

二、功能

脚本主要功能:

  • 根据关键字,输出所有分支

延伸功能:

  • 按需设置输出行数
  • 搜索关键词高亮
  • 精确匹配/模糊匹配

三、过程

最近开始学习,看网课时写了很多思维导图,但是在实际使用时,需要频繁打开思维导图查看,不是很方便
于是想仿照–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):从查找到关键词的行,继续往下输出的行数(需满足是分支)

四、收获

1.shell传参、变量括号

   ${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"

5.for while

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
比如只记得删除文件夹,却没办法匹配删除指定文件夹

猜你喜欢

转载自blog.csdn.net/tfnmdmx/article/details/129932101