linux | awk | shell脚本块删除

时间:2015-10-06 15:13:49

标签: linux shell awk gawk

我的输入文件包含如下所示的块。请帮我用awk或sed删除块及其内容

[abc]  
para1=123  
para2=456  
para3=111  

[pqr]  
para1=333    
para2=765    
para3=1345    

[xyz]    
para1=888    
para2=236    
para3=964    

现在如何完全删除一个块及其参数。请帮助我用awk命令实现这一点。提前谢谢

5 个答案:

答案 0 :(得分:2)

您可以将RS用于拆分块,(注意:NR>1因为awk在开始时生成一个空块)

awk -vRS='[' -v remove="pqr" '
   NR>1 && $0 !~ "^"remove"]" {printf "%s", "["$0; }
' file

你明白了,

[abc]
para1=123
para2=456
para3=111

[xyz]
para1=888
para2=236
para3=964

答案 1 :(得分:1)

取决于您希望如何过滤。如果要删除带有标题'[pqr]'

的块
awk '!/^\[pqr\]/' RS= ORS='\n\n' input

awk '$1 !~ "[pqr]"' RS= ORS='\n\n' input

如果要省略第二条记录(与上述相同)

awk 'NR!=2' RS= ORS='\n\n' input

如果要省略para2 = 765的记录,

awk '$3 !~ "765"' RS= ORS='\n\n' input

答案 2 :(得分:0)

我建议使用一个稍微不同的解决方案。

#!/bin/sh 

# specify the block to withhold
WITHHOLD=2

COUNT=1
INAWHITESP=0

while read i
do if [ -z "$i" -a "$INAWHITESP" -eq 0 ]
   then COUNT=$(( COUNT + 1 ))
        INAWHITESP=1
   fi
   if [ -n "$i" -a "$INAWHITESP" -eq 1 ]
   then INAWHITESP=0
   fi
   if [ "$COUNT" -ne "$WITHHOLD" ]
   then printf "%s\n" "$i"
   fi

done < inputfile > outputfile

答案 3 :(得分:0)

删除阻止abc

awk 'BEGIN{RS=""} !/\[abc\]/'

答案 4 :(得分:0)

用于移除块[abc]

的Perl解决方案
perl -lne 'BEGIN{$/=""} print "$_\n" unless /^\[abc\]/' file
  • -n循环输入文件的每一行,将行放在$ _变量中,不自动打印行

  • -l在处理之前删除换行符,然后将其添加回来

  • -e执行perl代码

$/是输入记录分隔符。在""块中将其设置为BEGIN{}会将Perl置于段落模式 $_是当前行 /^/是一个以搜索词

开头的正则表达式

输出:

[pqr]  
para1=333    
para2=765    
para3=1345    

[xyz]    
para1=888    
para2=236    
para3=964 

此变体可以使用-s进行参数解析,并将[abc]传递给变量$b

perl -slne 'BEGIN{$/=""} print "$_\n" unless /^$b/' -- -b='\[abc\]'