0

我的虚拟文本文件(一条实线)如下所示:

AAChvhkfiAFAjjfkqAPPMB

我想要:

  1. 删除部分文字(具体范围);
  2. 在文件中复制粘贴(特定范围的字符)。

我是怎么做的:

要在想要的位置(从 5 到 7 个字符和从 10 到 14 个字符)剪切部分文本,我使用cut

echo 'AAChvhkfiAFAjjfkqAPPMB' | cut --complement -c 5-7,10-14  
AAChfifkqAPPMB

但我真的不知道如何复制粘贴文本。例如:复制 15 到 18 个字符的文本并将其粘贴到字符 1 之后(也使用之前的剪切命令)。要获得这样的最终结果:

fkqAAAChfifkqAPPMB

所以我确实有问题:

  1. 如何使用 perl、awk 或 sed 读取给定范围的文本(从 .. 到)并将此文本粘贴到特定位置。
  2. 如何将此文本粘贴与先前的剪切命令结合起来,因为剪切后的文本将移动到左侧,因此将复制错误的文本。
4

4 回答 4

1

也许是这样的:

$ echo AAChvhkfiAFAjjfkqAPPMB | awk '{ print(substr($1, 0, 14) substr($1, 18) substr($1, 15, 3)) }'
AAChvhkfiAFAjjAPPMBfkq
于 2013-02-10T17:12:33.320 回答
1

中,您可以通过将字符串拆分为数组来使用数组切片

my $string = "AAChvhkfiAFAjjfkqAPPMB1";
my @arr = split //, $string;

切片(打印元素 5 到 7 和 10 到 14):

 print @array[5..7,10..14];

您也可以使用splice()重新排列数组。

perldoc 说:

从数组中删除由 OFFSET 和 LENGTH 指定的元素,并将它们替换为 LIST 的元素(如果有)。

请参阅http://perldoc.perl.org/perldata.html#Slices

于 2013-02-10T17:13:40.603 回答
1

在 Perl 中,我认为 substr 是一个不错的选择,例如。

$a = '1234567890';
#from pos 2, replace 3 chars with nothing, return the 3 chars
$b=substr($a,2,3,''); 
print "$a\t$b\n"; #1267890    345
#in posistion 0 (first), replace 0 characters (ie pure insert)
#with the content of $b
substr($a,0,0,$b);
print "$a\t$b\n"; #3451267890    345

有关详细信息,请参阅http://perldoc.perl.org/functions/substr.html 。splice() 也可能是候选者。

于 2013-02-10T17:19:39.227 回答
1

awk 非常简单:

kent$  echo "AAChvhkfiAFAjjfkqAPPMB"|awk  '
{for(i=5;i<=7;i++)$i="";
 for(i=10;i<=14;i++)$i="";
 for(i=15;i<=18;i++)t=sprintf("%s%s",t,$i);
 $0=t""$0}1' OFS="" FS=""
fkqAAAChfifkqAPPMB

编辑

要反转文本的一部分,您只需要交换t$i

kent$  echo "AAChvhkfiAFAjjfkqAPPMB"|awk  '
{for(i=5;i<=7;i++)$i="";
 for(i=10;i<=14;i++)$i="";
 for(i=15;i<=18;i++)t=sprintf("%s%s",$i,t);
 $0=t""$0}1' OFS="" FS=""
AqkfAAChfifkqAPPMB
于 2013-02-10T17:28:57.420 回答