Shell查找行并删除以下行

时间:2015-02-21 16:19:22

标签: bash shell

我有一个文本文件,其中包含按括号中的名称排序的条目:

[numberone]
someoption
more option
[numbertwo]
option
more option
[numberthree]
option
more option

我想删除[numbertwo]和它下面的给定数量的选项,保持其他所有选项不变。要删除的行是通过变量$ toremove输入的,并且文件在括号内的条目之间不应该有空行。 e.g。

./ remover.sh删除numbertwo

脚本运行后,文件应如下所示:

[numberone]
someoption
more option
[numberthree]
option
more option

3 个答案:

答案 0 :(得分:1)

解决这个问题的方法(通常非常肮脏)如下:

remover.sh

#!env bash

REMOVED_LINES=2 # fixed number of lines to be removed, here matching example data

INPUT=$1
TO_REMOVE=$2 
LINE=$(grep -n $TO_REMOVE $INPUT | sed -e 's/:/ /' | awk '{print $1}')
LAST_LINE=$(( $LINE+$REMOVED_LINES ))
sed -e ${LINE},${LAST_LINE}d $INPUT

鉴于数据:

$ cat > test.txt
[numberone]
someoption
more option
[numbertwo]
option
more option
[numberthree]
option
more option

$ ./remover.sh test.txt numbertwo
[numberone]
someoption
more option
[numberthree]
option
more option

如果numbertwo在文件中多次出现,则行为将不正确。

答案 1 :(得分:0)

使用awk

更容易
awk -v s='numberone' 'index($0, "[" s "]"){p=1;next} p && /^\[/{p=0} !p' file
[numbertwo]
option

Working Demo

答案 2 :(得分:0)

编辑此答案基于过去版本的问题,并附有不同的目标陈述。我的回答是基于OP想要保持[numbertwo]以后的所有行的解释。


您可以使用以下一个衬垫轻松实现此目的:

$ cat > test.txt
[numberone]
someoption
more option
[numbertwo]
option

$ tac test.txt | sed -e '/numbertwo/q' | tac
[numbertwo]
option

这将使sed在找到模式时停止。正如你想要之后的所有并包括[numbertwo]一样,诀窍就是反转文件,让它保留所有文件,直到找到numbertwo,立即退出,然后再次反转内容。