问题出现在运行shell脚本的过程中:
在一个文本中剔除掉B、b开头的单词
#!/bin/bash
cat >> input.txt << EOF
big
nowcoder
Betty
basic
test
EOF
sed -ri '/^(B|b)/{d}' input.txt
正常返回的结果应该是这样的:
nowcoder
test
但是运行结果是这样的:
注: sed.sh 是脚本的名字
[root@server-104 /home/shell/niuke]# ./sed.sh
[root@server-104 /home/shell/niuke]# ls
input.txt input.txtr sed.sh
[root@server-104 /home/shell/niuke]#
[root@server-104 /home/shell/niuke]#
[root@server-104 /home/shell/niuke]# cat input.txt
big
nowcoder
Betty
basic
test
[root@server-104 /home/shell/niuke]#
可以看到执行的结果和原数据一模一样,而且本应该在当前目录中生成一个input.txt的,但还另外多生成了一个input.txtr 。。。这是个什么玩意,咋来的?
搜集多方资料得知: 使用man 查看 sed 的手册 ,其中关于-i参数做了如下解释:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
意思是就地编辑文件,如果有后缀存在则执行备份 ,生成input.txtr的原因 应该就是 sed -ir 中的r被当成了input.txt 的备份后缀 。这里我也换别的试了一下,确实是这样。
例如: 把 “sed -ir xxxxx “ 换成 “sed -itest xxxxxx” ,生成的文件就成了下面这样
[root@server-104 /home/shell/niuke]# ls
input.txt input.txttest sed.sh
如果我们想要得到正确的结果,将sed 命令的 -r参数真正发挥作用,那么应该 将 r参数写在i 参数前面
本人毕业刚刚入职系统运维工程师的岗位 ,工作内容大部分是阿里云上服务的维护,对linux基础操作接触不多,但有一定的基础。欢迎即将准备入行或已经在职linux运维相关岗位的小伙伴来私信交流。