linux|awk|shell 脚本块删除

linux|awk|shell script block deletion

我的输入文件包含如下块。请帮助我使用 awk 或 sed

删除块及其内容
[abc]  
para1=123  
para2=456  
para3=111  

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

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

现在如何完全删除一个块及其参数。请提前用awk command.Thanks帮我实现这个

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

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

你明白了,

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

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

我提出了一个略有不同的解决方案,仅使用 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

取决于您要如何过滤。如果你想删除带有 header '[pqr]'

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

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

如果要省略第2条记录(同上)

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

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

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

删除块abc

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

删除块的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\]'