使用sed实现,把一个文本文档中的前5行中包含字母的行删除掉。
参考答案:head -5 1.txt |sed '/[a-Z]/d'
参考答案:head -5 1.txt |sed '/[a-Z]/d'
0
题目要求的是删除前5行中包含字母的行,而不仅仅是删除其中的字母,脚本如下:
#!/bin/bash
## This script is for deleting all the letter lines in a file's head fine lines.
## Writed by Louis on 2014/08/30 23:55
line=`head -5 test.txt|grep -n '[a-Z]'|awk -F ':' '{print $1}'|sort -r`
for i in $line; do
sed -i "$i"d test.txt
done
假定文本文档为test.txt
运行脚本前文档前6行:
[root@localhost lianxi]# head -6 test.txt|grep -n '.*'
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:::2:2::/808038-3769-38920961083-=+
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
运行脚本后:
[root@localhost lianxi]# head -6 test.txt|grep -n '.*'
1::::2:2::/808038-3769-38920961083-=+
2:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
3:sync:x:5:0:sync:/sbin:/bin/sync
4:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
5:halt:x:7:0:halt:/sbin:/sbin/halt
6:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
思路:查找输出符合条件的行号(注意:行号逆序),for循环删除行<在这里,前面的行号逆序就起作用了,因为正序的话,如删除第一行,原文档的第二行,会变成第一行>。
另一小注意点:sed -i "$i"d test.txt,sed语句,要删除(或打印)的行如是变量,用双引号;如仍用单引号,会原封不动输出$i,然后结合d,变成一个变量$id。
#!/bin/bash
## This script is for deleting all the letter lines in a file's head fine lines.
## Writed by Louis on 2014/08/30 23:55
line=`head -5 test.txt|grep -n '[a-Z]'|awk -F ':' '{print $1}'|sort -r`
for i in $line; do
sed -i "$i"d test.txt
done
假定文本文档为test.txt
运行脚本前文档前6行:
[root@localhost lianxi]# head -6 test.txt|grep -n '.*'
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:::2:2::/808038-3769-38920961083-=+
5:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
运行脚本后:
[root@localhost lianxi]# head -6 test.txt|grep -n '.*'
1::::2:2::/808038-3769-38920961083-=+
2:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
3:sync:x:5:0:sync:/sbin:/bin/sync
4:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
5:halt:x:7:0:halt:/sbin:/sbin/halt
6:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
思路:查找输出符合条件的行号(注意:行号逆序),for循环删除行<在这里,前面的行号逆序就起作用了,因为正序的话,如删除第一行,原文档的第二行,会变成第一行>。
另一小注意点:sed -i "$i"d test.txt,sed语句,要删除(或打印)的行如是变量,用双引号;如仍用单引号,会原封不动输出$i,然后结合d,变成一个变量$id。
编辑回复