需求
- 一个文本文档里面的内容有数字,英文,以及被 [] 包起来的英文
- 从这个文档里面只筛选英文, 不包含被 [] 包起来的英文
- 对于一行的字符小于一定长度的行,在输出时不换行,也就是如果一行的文字小于某一个长度时,与下一行合并成一行输出
代码
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 # 要读取的文件
知识点
- 正则表达式的应用
- 在 shell 中进行关系运算时要使用关系运算符,比如代码中的小于的判断,要用 -lt 而不是 <
- echo -e “${line} \c” 不换行输出,这里记得要在${line} 的后面加一个空格,否则与下一行的单词就没有间隔了
踩的坑
- echo $line >> output.txt 这里使用的是追加的方式输出到文件中,所以在每次要重新测试时,要记得把之前生成的文件删除,不然如果数据比较多的话可能会以为没有效果
- 另一个就是换行符的问题了,这个问题困扰了很久,很难发现。就是在 unix 系统和 windows 系统中采用不同的换行符,具体区分可以参考这篇文章,mac 系统中以前是 CR,现在也是 LF。
- 这里出现的问题就是,当文件使用的是 CRLF 换行的话,脚本中的换行输出就没有效果了,当文件使用是 LF 的话就可以按照我们设定的条件进行不换行输出。
- 那么接下来的问题就是如何把 CRLF 换成 LF 了,在网上查了很多资料,大部分讲的是在跨平台开发时,如何用 git 来转换,当前的操作用不用 git,也没必要那么麻烦。
- 最后的解决办法就是利用 idea,在 idea 的下面有一个选项,可以选择 LF 或是 CRLF ,选择 LF 之后把内容复制到 idea 中直接就会转成 LF 。