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\]'
我的输入文件包含如下块。请帮助我使用 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\]'