2015-10-06 97 views
0

我的输入文件具有如下块。请帮我删除块和用awk或sed的linux | awk | shell脚本块删除

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

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

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

现在它的内容如何删除块及其参数完全。请帮我AWK command.Thanks实现这一目标提前

回答

0

Perl的解决方案,不会自动删除块[abc]

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\]' 
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 
+2

好主意。你可以简化:'awk -F']'-v RS ='['-v ORS ='['-v remove ='pqr''$ 1!= remove'',加上一个步骤来整理杂散ORS在输出结束 –

+0

我喜欢你的解决方案,更好.... –

+0

嗨,感谢您的想法,但是,但是这并不工作好,当我有像块 [abc] 块的输入1 = [run ] 2 = [停止] 请帮助我一样的命令 –

0

我提出了一个稍微不同的解决方案,只使用shell。

#!/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 
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 
0

要删除块abc

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