剪切并复制粘贴给定文本的位置

时间:2013-02-10 16:56:56

标签: regex perl text sed awk

我的虚拟文本文件(一个连续的行)如下所示:

AAChvhkfiAFAjjfkqAPPMB

我想:

  1. 删除部分文字(特定范围);
  2. 文件中的复制粘贴(特定字符范围)。
  3. 我是怎么做到的:

    要剪切所需位置的部分文字(从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 个答案:

答案 0 :(得分:1)

也许是这样的:

$ echo AAChvhkfiAFAjjfkqAPPMB | awk '{ print(substr($1, 0, 14) substr($1, 18) substr($1, 15, 3)) }'
AAChvhkfiAFAjjAPPMBfkq

答案 1 :(得分: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

答案 2 :(得分: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()也可能是候选人。

答案 3 :(得分: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