我有一个文本文件,其中包含按括号中的名称排序的条目:
[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
答案 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
答案 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
,立即退出,然后再次反转内容。