我有一个与此类似的问题: Delete lines from file with SED or AWK
如何删除以3和5开头的行以及此文件中的所有内容:
ssadfsadfsdf
asdfsadf
asdfsadf
asdfsadf
asdfsdf
1 z z z lkj klj lkj
2 satan er kaerleikur lkj lkj lkj
3 z z z
4 asdflj asd sdf
5 z z z
6 asdf sdaf asdf
7 z z z lkj lkj lkj
8 sdf safd asdf
9 z z z
如果答案显然在其他地方,我会删除这个问题。
如果它看起来像这样:
asd ssadfsadfsdf
asd asdfsadf
asd asdfsadf
asd asdfsadf
asd asdfsdf
asd 1 z z z lkj klj lkj
asd 2 satan er kaerleikur lkj lkj lkj
asd 3 z z z
asd 4 asdflj asd sdf
asd 5 z z z
asd 6 asdf sdaf asdf
asd 7 z z z lkj lkj lkj
asd 8 sdf safd asdf
asd 9 z z z
答案 0 :(得分:4)
您可以使用awk 范围模式跳过第1行到第2行的匹配模式:
awk '$1 == 3, $1 == 5 { next }; { print }' INFILE
我在字段$1
上进行数字比较,而不是像/^3/
这样的正则表达式,因为它也会匹配'30','31'等。
如果该数字是该行的第二个字段(如您编辑的示例输入中所示),则只需将$1
更改为$2
即可。如果这对您有用,请告诉我。
答案 1 :(得分:3)
一个快速的谷歌给了我这个秒钟回答:
http://www.cyberciti.biz/faq/sed-howto-remove-lines-paragraphs/
$ sed '/WORD1/,/WORD2/d' input.txt > output.txt
为了确保它与您所说的“行首”相匹配,您可以使用^
符号启动模式。
如果您正在使用Vim(内置了sed),您可以执行range command
之类的操作:
:/^3.*/,/^5.*/ d
其中d是删除命令,:/exp1/,/exp2/
范围。
答案 2 :(得分:1)
awk '/^3/ {del=1}
(del==0) {print}
/^5/ {del=0}' FILE
答案 3 :(得分:0)
awk '$2!~/^[3|5]/' yourFile
会为你做的。
见下面的测试:
kent$ echo "asd ssadfsadfsdf
asd asdfsadf
asd asdfsadf
asd asdfsadf
asd asdfsdf
asd 1 z z z lkj klj lkj
asd 2 satan er kaerleikur lkj lkj lkj
asd 3 z z z
asd 4 asdflj asd sdf
asd 5 z z z
asd 6 asdf sdaf asdf
asd 7 z z z lkj lkj lkj
asd 8 sdf safd asdf
asd 9 z z z"|awk '$2!~/^[3|5]/'
输出:
asd ssadfsadfsdf
asd asdfsadf
asd asdfsadf
asd asdfsadf
asd asdfsdf
asd 1 z z z lkj klj lkj
asd 2 satan er kaerleikur lkj lkj lkj
asd 4 asdflj asd sdf
asd 6 asdf sdaf asdf
asd 7 z z z lkj lkj lkj
asd 8 sdf safd asdf
asd 9 z z z