如何删除两者之间的所有内容:但是如果在{}'之间删除?

时间:2014-08-10 01:43:59

标签: bash perl awk sed

我有一个这样的文本文件:

This is {an example} of : some of the: text.
This is yet {another : example :} of some of the text.
:This: is :still :yet another {:example:} of :some text:.

我需要删除在任何:内找到的任何文字,包括:,但如果它们属于{}对,则不需要

  • {}之间的任何内容都是安全的,包括:
  • 不在{}之间但在::之间找到的任何内容都将被删除。
  • :{之外找到的}都已删除。

输出如下:

This is {an example} of  text.
This is yet {another : example :} of some of the text.
 is yet another {:example:} of .
  • 每行只有一组大括号。
  • 配对的大括号永远不会分开。
  • 在大括号内部或外部的行上可能有:个任意数量。
  • :总是成对出现。

如何删除冒号之间的所有内容,包括冒号本身,但不是在用大括号保护时?

到目前为止,我最好的尝试是使用awk -F"{" '{ print $1 }' > file1.txtawk -F"{" '{ print $2 }' > file2.txt等将大括号周围的线条拆分为不同的,在特定文件上运行sed以删除部件,但不是在包含大括号内的数据的文件上,然后将它与paste一起组装回来,但这个解决方案太复杂了。

4 个答案:

答案 0 :(得分:2)

这将按照您的要求进行

use strict;
use warnings;

my $data = do {
  local $/;
  <DATA>;
};

my @parts = split m/ ( \{ [^{}]* \} ) /x, $data;

for (@parts) {
  s/ : [^:]* : //gx unless /^\{/;
}

print @parts, "\n";


__DATA__
This is {an example} of : some of the: text.
This is yet {another : example :} of some of the text.
:This: is :still :yet another {:example:} of :some text:.

<强>输出

This is {an example} of  text.
This is yet {another : example :} of some of the text.
 is yet another {:example:} of .

答案 1 :(得分:2)

这很简单,请尝试以下方法:

perl -pe 's/({[^{}]*})|:[^:]*:/$1/g' file

{}内的所有文本都保存在$ 1中,因此被跳过:)

答案 2 :(得分:1)

Perl:

#!/usr/bin/env perl

while (<>) {
    my @chars = split //;
    foreach my $c (@chars) {
        if ($c eq "{" .. $c eq "}") {
            print "$c";
        } elsif ($c eq ":" ... $c eq ":") {
        }
        else {
            print "$c";
        }
    }
}

或更简洁地说:

while (<>) {
    print grep {/\{/ .. /\}/ or not /:/ ... /:/} split //;
}

答案 3 :(得分:0)

计算大括号和冒号:

perl -ne '
    $b = $c = 0;
    for $char (split //) {
        $b++ if $char eq "{"; 
        $b-- if $char eq "}";
        if ($b > 0) { 
            print $char; 
        }
        else {
            if ($c == 0 and $char eq ":") {
                $c++;
            }
            else {
                print $char if $c == 0;
                $c-- if $c == 1 and $char eq ":";
            }
        }
    }
' <<END
This is {an example} of : some of the: text.
This is yet {another : example :} of some of the text.
:This: is :still :yet another {:example:} of :some text:.
END
This is {an example} of  text.
This is yet {another : example :} of some of the text.
 is yet another {:example:} of .