一般来讲,这个事儿是sed该干的,但是,sed做起来也不那么简单,可能每次写都需要问百度。
bash如何实现呢?
这里涉及了三种情况:
- 空行(空字符)
- 行首空字符
- 行尾空字符
- 空字符可能是空格有可能是tab,一般也就这两种情况了
写起来是不是比较麻烦?
脚本:
1 2 3 |
while read line; do [[ "$line" == "" ]] || echo "$line" done |
简直不敢相信,远比sed要简单的多吧。
因为read自然帮我们去的掉了行首行尾的空白了。
不过需要注意的是:
- 这里echo的$line 是加了双引号的,如果没有双引号,echo 就会帮我们把line中间的空格或tab给吃掉,连续的空白只剩余一个空格;加入我们想要的就是这种效果的话,你们直接去掉双引号就行了,省却考虑相关处理逻辑了
- 如果文件中含有类似 “a\+b\c” 这种包含了\ 的字符串,处理完之后, \ 就没了; 所以,上面的处理方式有局限性
- 如果文件是二进制文件,也不能这样处理
关于echo “$line” 中双引号的作用:
假如 line=”1 2 3″
echo $line 等效于 echo 1 2 3 ;根据我们基本的认知,2和3中间有多少个空格都等于1个空格,对于echo来讲都是3个参数
echo “$line” 等效于 echo “1 2 3” ; 这里的echo接收到的是1个参数,自然不能随意丢掉其中的空格