按条件提取文件内容

需求

  1. 一个文本文档里面的内容有数字,英文,以及被 [] 包起来的英文
  2. 从这个文档里面只筛选英文, 不包含被 [] 包起来的英文
  3. 对于一行的字符小于一定长度的行,在输出时不换行,也就是如果一行的文字小于某一个长度时,与下一行合并成一行输出

代码

while read line; do
	#statements
	# 在写正则表达式的时候不用用引号括起来
	# [^\[]]: 不包含 [] 行
	# 如果这一行包含 [] 就跳过
if [[ $line =~ [^\[]] ]]; then
	continue
fi
	# ^[a-zA-Z]: 筛选开头为字母的行
	# [a-zA-Z]:筛选包含字母的行
if [[ $line =~ [a-zA-Z] ]]; then
	# 把每一行追加到文件中
	# ${#line} line 的长度
	
	# 判断大小时要用这种方式,不能直接用 > < 号
	if [[ ${#line} -lt 23 ]]; then
		# echo -e "${line} \c" 不换行输出
		echo -e "${line} \c" >> output.txt
	else
		echo $line >> output.txt;
	fi

fi
done < /personal/shell/a.txt # 要读取的文件

知识点

  1. 正则表达式的应用
  2. 在 shell 中进行关系运算时要使用关系运算符,比如代码中的小于的判断,要用 -lt 而不是 <
  3. echo -e “${line} \c” 不换行输出,这里记得要在${line} 的后面加一个空格,否则与下一行的单词就没有间隔了

踩的坑

  1. echo $line >> output.txt 这里使用的是追加的方式输出到文件中,所以在每次要重新测试时,要记得把之前生成的文件删除,不然如果数据比较多的话可能会以为没有效果
  2. 另一个就是换行符的问题了,这个问题困扰了很久,很难发现。就是在 unix 系统和 windows 系统中采用不同的换行符,具体区分可以参考这篇文章,mac 系统中以前是 CR,现在也是 LF
  3. 这里出现的问题就是,当文件使用的是 CRLF 换行的话,脚本中的换行输出就没有效果了,当文件使用是 LF 的话就可以按照我们设定的条件进行不换行输出。
  4. 那么接下来的问题就是如何把 CRLF 换成 LF 了,在网上查了很多资料,大部分讲的是在跨平台开发时,如何用 git 来转换,当前的操作用不用 git,也没必要那么麻烦。
  5. 最后的解决办法就是利用 idea,在 idea 的下面有一个选项,可以选择 LF 或是 CRLF ,选择 LF 之后把内容复制到 idea 中直接就会转成 LF

你可能感兴趣的:(shell)