2015-10-06 124 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\]/'