我的輸入文件具有如下塊。請幫我刪除塊和用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實現這一目標提前
我的輸入文件具有如下塊。請幫我刪除塊和用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實現這一目標提前
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\]'
你可以使用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
我提出了一個稍微不同的解決方案,只使用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
取決於您想要如何過濾。如果要刪除與所述報頭中的塊 '[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
要刪除塊abc
awk 'BEGIN{RS=""} !/\[abc\]/'
好主意。你可以簡化:'awk -F']'-v RS ='['-v ORS ='['-v remove ='pqr''$ 1!= remove'',加上一個步驟來整理雜散ORS在輸出結束 –
我喜歡你的解決方案,更好.... –
嗨,感謝您的想法,但是,但是這並不工作好,當我有像塊 [abc] 塊的輸入1 = [run ] 2 = [停止] 請幫助我一樣的命令 –