Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于删除某些列的Regexp_Regex_Shell_Sed - Fatal编程技术网

用于删除某些列的Regexp

用于删除某些列的Regexp,regex,shell,sed,Regex,Shell,Sed,我有以下格式的输入: <apple1> <orange1> : <apple2> <orange2> : <apple3> <orange3> : ... 但跳过苹果的第一部分,这总是会遇到问题 任何人都可以提供解决此任务的regexp吗 真实世界示例输入: appleappleapplorangeorangeorangeo:appleappleapplorangeorangeorangeo:appleappleapplo

我有以下格式的输入:

<apple1> <orange1> : <apple2> <orange2> : <apple3> <orange3> : ...
但跳过苹果的第一部分,这总是会遇到问题

任何人都可以提供解决此任务的regexp吗

真实世界示例输入:

appleappleapplorangeorangeorangeo:appleappleapplorangeorangeorangeo:appleappleapplorangeorangeorangeo
foofoofoofoofobarbarbarbarbarbarb:foofoofoofoofobarbarbarbarbarbarb:foofoofoofoofobarbarbarbarbarbarb
xxxxxxxxxxxxxxooooooooooooooooooo:ppppppppppppppqqqqqqqqqqqqqqqqqqq:nnnnnnnnnnnnnnttttttttttttttttttt
输出应如下所示:

appleappleapplorangeorangeorangeo:orangeorangeorangeo:orangeorangeorangeo
foofoofoofoofobarbarbarbarbarbarb:barbarbarbarbarbarb:barbarbarbarbarbarb
xxxxxxxxxxxxxxooooooooooooooooooo:qqqqqqqqqqqqqqqqqqq:ttttttttttttttttttt

此作业更适合于
awk
,因为输入文件使用已知的分隔符(即
冒号
)按行和列进行良好的结构:

awk 'BEGIN{FS=OFS=":"} {for (i=2; i<=NF; i++) $i = substr($i, 15)} 1' file

appleappleapplorangeorangeorangeo:orangeorangeorangeo:orangeorangeorangeo
foofoofoofoofobarbarbarbarbarbarb:barbarbarbarbarbarb:barbarbarbarbarbarb
xxxxxxxxxxxxxxooooooooooooooooooo:qqqqqqqqqqqqqqqqqqq:ttttttttttttttttttt

awk'BEGIN{FS=OFS=“:”}{for(i=2;i您的正则表达式到sed几乎是正确的。只需反复匹配“:{u 14_19”并删除14部分。(注意:我在下面使用逗号作为正则表达式分隔符,因为它们更易于阅读。)

使用perl

我们的输入
appleappleapplorangeorangeo:appleappleapplorangeorangeo:appleappleapplorangeorangeo

让我们假设
a=appleappleappl
(14个字符)
b=OrangeRangeOrangeO
(19个字符)
c=appleappleapplorangeorangeo:appleappleapplorangeorangeo
(行的其余部分,是
a
b
的重复组合

预期输出:在第一个冒号(
)之前,保留
a
b
,在第一个冒号之后,仅保留
b
。 ${a}${b}:${b}:${b}:..(如果我错了,请纠正我)

因此,这里再次回顾一下输入和输出

我们的输入:
appleappleapplorangeorangeo:appleappleapplorangeorangeo:appleappleapplorangeorangeo

预期输出:
AppleAppleAppOrangeOrangeO:orangeorangeorangeo:orangeorangeorangeo

请尝试以下脚本:(如前所述,这是使用perl而不是shell)

样本数据:


谢谢。

管道符号在哪里?
?对不起,编辑失控了。我的意思是冒号。问题被编辑了。你是如何存储输出的?这很重要,因为你可以像
head-c 14
那样将第一个苹果输入到输出中。对于这个问题,你的输入是什么样的?@Alfe你能发布一个真实的例子吗?我的意思是,用real apple/orange,3-4列真是太棒了。太多了。谢谢你,但是使用regexp的整个想法是为了保持它的小而简单。对不起,但是你的解决方案在这方面太离谱了。你是对的!在这一点上不能不同意。是的,这个解决方案不小;P@Alfe:我可以问你,你需要多少这种特定类型的数据吗进程?你的方案是什么,可以分享一些信息。我大约有40行输入(准确地说,每季度;-)是的,我认为如果没有更好的弹出窗口,这将很好。我不希望依赖某些行中有冒号的事实,但由于它们是我的规范的一部分,我认为这是最短的解决方案。
appleappleapplorangeorangeorangeo:orangeorangeorangeo:orangeorangeorangeo
foofoofoofoofobarbarbarbarbarbarb:barbarbarbarbarbarb:barbarbarbarbarbarb
xxxxxxxxxxxxxxooooooooooooooooooo:qqqqqqqqqqqqqqqqqqq:ttttttttttttttttttt
awk 'BEGIN{FS=OFS=":"} {for (i=2; i<=NF; i++) $i = substr($i, 15)} 1' file

appleappleapplorangeorangeorangeo:orangeorangeorangeo:orangeorangeorangeo
foofoofoofoofobarbarbarbarbarbarb:barbarbarbarbarbarb:barbarbarbarbarbarb
xxxxxxxxxxxxxxooooooooooooooooooo:qqqqqqqqqqqqqqqqqqq:ttttttttttttttttttt
$ export A='appleappleapplorangeorangeorangeo:appleappleapplorangeorangeorangeo:appleappleapplorangeorangeorangeo:foofoofoofoofobarbarbarbarbarbarb:foofoofoofoofobarbarbarbarbarbarb:foofoofoofoofobarbarbarbarbarbarb:xxxxxxxxxxxxxxooooooooooooooooooo:ppppppppppppppqqqqqqqqqqqqqqqqqqq:nnnnnnnnnnnnnnttttttttttttttttttt'
$ echo $A | sed -Ee 's,:.{14}(.{19}),:\1,g'
appleappleapplorangeorangeorangeo:orangeorangeorangeo:orangeorangeorangeo:barbarbarbarbarbarb:barbarbarbarbarbarb:barbarbarbarbarbarb:ooooooooooooooooooo:qqqqqqqqqqqqqqqqqqq:ttttttttttttttttttt
%_Host@User> cat apple.pl
#!/usr/bin/perl

use strict;
use warnings;

while (<>) {
  chomp $_ ;
  my @tmp = split /:/, $_ ;
  my ($a,$b) = (substr($tmp[0],0,14), substr($tmp[0],14,19)) ;
  my $str = "$a"."$b" ;

  foreach my $i (1..$#tmp) {
    $tmp[$i] =~  s/$a//g ;
    $str .= ":"."$tmp[$i]"  ;
  }
  print "$str\n" ;
}
%_Host@User>
%_Host@User> cat td_apple |./apple.pl
appleappleapplorangeorangeorangeo:orangeorangeorangeo:orangeorangeorangeo
foofoofoofoofobarbarbarbarbarbarb:barbarbarbarbarbarb:barbarbarbarbarbarb
xxxxxxxxxxxxxxooooooooooooooooooo:ppppppppppppppqqqqqqqqqqqqqqqqqqq:nnnnnnnnnnnnnnttttttttttttttttttt
%_Host@User> cat td_apple
appleappleapplorangeorangeorangeo:appleappleapplorangeorangeorangeo:appleappleapplorangeorangeorangeo
foofoofoofoofobarbarbarbarbarbarb:foofoofoofoofobarbarbarbarbarbarb:foofoofoofoofobarbarbarbarbarbarb
xxxxxxxxxxxxxxooooooooooooooooooo:ppppppppppppppqqqqqqqqqqqqqqqqqqq:nnnnnnnnnnnnnnttttttttttttttttttt
%_Host@User>