我的输入文件包含如下所示的块。请帮我用awk或sed删除块及其内容
[abc]
para1=123
para2=456
para3=111
[pqr]
para1=333
para2=765
para3=1345
[xyz]
para1=888
para2=236
para3=964
现在如何完全删除一个块及其参数。请帮助我用awk命令实现这一点。提前谢谢
答案 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 -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\]'