我有一个这样的文本文件:
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.txt
,awk -F"{" '{ print $2 }' > file2.txt
等将大括号周围的线条拆分为不同的,在特定文件上运行sed
以删除部件,但不是在包含大括号内的数据的文件上,然后将它与paste
一起组装回来,但这个解决方案太复杂了。
答案 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 .