Text 从文件中删除行

Text 从文件中删除行,text,sed,awk,gawk,Text,Sed,Awk,Gawk,我有一个类似的问题: 如何删除此文件中以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 如果答案在别处,我

我有一个类似的问题:

如何删除此文件中以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

一个快速的谷歌给了我这个答案:

为了确保它与您所说的“行首”匹配,您可以使用
^
符号开始模式

如果您使用的是Vim(内置sed),您可以执行
范围命令
,如:

:/^3.*/,/^5.*/ d

其中d是delete命令,
:/exp1/,/exp2/
是范围。

一个快速的谷歌给了我这个答案:

awk '/^3/ {del=1}
     (del==0) {print}
     /^5/ {del=0}' FILE

为了确保它与您所说的“行首”匹配,您可以使用
^
符号开始模式

如果您使用的是Vim(内置sed),您可以执行
范围命令
,如:

:/^3.*/,/^5.*/ d
其中d是delete命令,
:/exp1/,/exp2/
范围。

您可以使用awk范围模式将行匹配模式1跳到模式2:

awk '/^3/ {del=1}
     (del==0) {print}
     /^5/ {del=0}' FILE
awk '$1 == 3, $1 == 5 { next }; { print }' INFILE
我对字段
$1
进行了数值比较,而不是像
/^3/
这样的正则表达式,因为它也会匹配“30”、“31”等

如果数字是行的第二个字段(如编辑的示例输入),只需将
$1
更改为
$2
。让我知道这是否适合您。

您可以使用awk范围模式将线匹配模式1跳过到模式2:

awk '$1 == 3, $1 == 5 { next }; { print }' INFILE
awk '$2!~/^[3|5]/' yourFile 
我对字段
$1
进行了数值比较,而不是像
/^3/
这样的正则表达式,因为它也会匹配“30”、“31”等

如果数字是行的第二个字段(如编辑的示例输入),只需将
$1
更改为
$2
。让我知道这是否适合你

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
我会帮你的

请参见下面的测试:

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

同样有效,但以5开头的行保留,因此我改为^6。只需在(del==0)条件之前移动/^5/匹配行在Mawk中,这将删除所有内容,包括以
5开头的行。将
^5
向上移动一行会使其保留该行。同样有效,但以5开头的行会保留,因此我将^6改为。只需在(del==0)条件之前移动/^5/匹配行在Mawk中,这将删除以
5
开头的行之前的所有内容。将
^5
移动一行会使其保留该行。我将问题解释为“4”行也应删除。是的,如何使3和5以及其间的所有内容消失。Awk语法几乎不是人类可读的。我对这个问题的解释是“4”行也应该被删除。是的,你如何使3和5以及两者之间的所有东西消失。Awk语法几乎不是人类可读的,如果我想删除某个数字以下的所有行,那么我会这样做:Awk'$1<5,{next};{print}'infle,也就是说,如果第一个字段是一个数字索引。如果我想删除某个数字下面的所有行,那么我会这样做:awk'$1<5,{next};{print}INFILE,即如果第一个字段是数字索引。