仅删除第1次和第3次出现的阻止内容

时间:2018-06-02 18:14:40

标签: awk sed

在sed下面删除了{content-start}和{content-end}之间出现的所有块,但是只想删除第1个和第3个块而不是第2个块。

sed -ie '/{content-start.*}/,/{content-end}/d' test.txt

的test.txt:

{content-start}
abc1
def1
ghi1
{content-end}
{content-start}
abc2
def2
ghi2
{content-end}
{content-start}
abc3
def3
ghi3
{content-end}

3 个答案:

答案 0 :(得分:0)

关注awk可能会对您有所帮助。

awk '
/^{content-start}/{
  flag=1;
  count++}
flag && count!=1 && count!=3;
/^{content-end}/{
  flag=""}
'  Input_file

根据您的示例,Input_file将是输出。

{content-start}
abc2
def2
ghi2
{content-end}

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -n '/{content-start}/{x;s/^/x/;x;:a;N;/{content-end}/!ba;x;/^x\{2\}$/{x;p;x};x}' file

使用-n选项复制seds grep-like-nature。收集开始和结束标记之间的线。在集合开始时,向保留空间附加一个标志以用作计数器。收集了所有必需的行后,仅在保留空间包含所需数字时打印。

此解决方案仅打印第二个块,但是如果您只想排除块1和块3,则:

sed '/{content-start}/{x;s/^/x/;x;:a;N;/{content-end}/!ba;x;/^x\{1\}$/{x;d};/^x\{3\}/{x;d};x}' file

此解决方案仅删除块1和3。

答案 2 :(得分:0)

sed用于单个行的简单替换,即s / old / new /,全部。对于其他任何你应该使用awk:

gzip

或者如果你想要对单个行做任何事情,那么将记录的每一行保存在一个数组中,而不是将整个记录保存为字符串:

tarfile

以上内容适用于任何UNIX系统上任何shell中的任何awk,如果/当您的需求发生变化,则可以轻松增强。