【问题标题】:Cut and copy-paste given positions of the text剪切和复制粘贴文本的给定位置
【发布时间】:2013-01-25 20:18:16
【问题描述】:

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

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. 如何将此文本粘贴与上一个剪切命令结合起来,因为剪切后的文本会移动到左侧,因此会复制错误的文本。

【问题讨论】:

    标签: regex perl text sed awk


    【解决方案1】:

    可能是这样的:

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

    【讨论】:

      【解决方案2】:

      ,您可以使用数组切片,将字符串拆分成一个数组

      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

      【讨论】:

        【解决方案3】:

        在 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() 也可能是一个候选者。

        【讨论】:

          【解决方案4】:

          使用 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
          

          【讨论】:

          • 这里的1 是什么意思$0=t""$0}1'?另外,我只想说清楚:$0=t""$0 - 组合成序列并将它们打印出来(打印 t 然后打印 $0)。但是如果我想在$0 中打印t 怎么办?如何在$0字符串中的特定位置打印t
          • Joachim Pileborg 的回答如下使用substr() - 我可以想象用它来划分最终的$0 并按首选顺序打印,但它们应该是更简单的方法。
          • 1{...} 块之外意味着 print $0 如果你想打印 t 在例如在第三个字母之后,您可以$3=$3""t$3=sprintf('%s%s',$3,t)
          • 我真的很喜欢这个解决方案,但问题是这个东西:awk: program limit exceeded: maximum number of fields size=32767 - 不得不使用 Joachim Pileborg 解决方案(没有最大字段错误)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-10
          • 2013-05-13
          相关资源
          最近更新 更多