按条件提取文件内容

需求

  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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值