首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用linux命令删除文件中子标题下的行?

问如何使用linux命令删除文件中子标题下的行?
EN

Unix & Linux用户
提问于 2015-10-22 05:33:25
回答 2查看 267关注 0票数 3

我有一份文件如下。在其中,我想单独删除特定子标题下的行。我试过使用sed和awk命令,但没有得到。有谁能用一些linux命令来帮助破解这个问题呢?

代码语言:javascript
复制
[first attempt]
a=10
b=20

[second attempt]
a=20
b=20

[third attempt ] 
a=30
b=50

我想单独删除“第二次尝试”副标题下的行。输出应如下。我只想删除子标题下的内容,并且可以选择将删除的行替换为一个空行。

代码语言:javascript
复制
[first attempt]
a=10
b=20

[second attempt]

[third attempt ] 
a=30
b=50
EN

回答 2

Unix & Linux用户

发布于 2015-10-22 09:07:14

代码语言:javascript
复制
awk -v blkid=0 -v rmblk=2 '{
      if ( $1 ~ /^\[/) {
            blkid+=1;blkn=NR;print };
      if ( blkid !=rmblk && NR!=blkn )
            print ;
      else if(blkid ==rmblk && NF == 0)
                  print ""}' file.txt

每个块将有id,从每个块的增量1开始:blkid。

要删除的块的块id:rmblk

当第一个字段以[开始时,每个块将启动。

变量blkn存储[first attempt] [second attempt]等的NR值。

票数 1
EN

Unix & Linux用户

发布于 2015-10-23 14:46:36

您也可以使用一个简短的sed脚本来完成这个任务。将以下内容放入文件中:

代码语言:javascript
复制
/second/ {
   n
   : del
   /./ ! b
   N
   s/.*\n//
   b del
}

叫它script。然后使用sed -f script myfile。如果您正在尝试编辑文件,请使用sed -i -f script myfile,但我建议您在尝试该命令之前运行第一个命令,并确保它恰好是您想要的输出。

解释:

找到字符串second后,sed将查看下一行。如果该行不是空的,则会丢弃该行,并查看文件中的下一行,直到找到空行为止。文件中的空行和所有其他行都会被打印出来。(除非有另一行包含字符串second,在这种情况下,进程会重复。)

(如果有人感兴趣,我可以解释更多。)

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/237822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档