Regex 剪切并复制粘贴文本的给定位置
我的虚拟文本文件(一个连续行)如下所示:Regex 剪切并复制粘贴文本的给定位置,regex,perl,text,sed,awk,Regex,Perl,Text,Sed,Awk,我的虚拟文本文件(一个连续行)如下所示: AAChvhkfiAFAjjfkqAPPMB fkqAAAChfifkqAPPMB 我想: 删除部分文字(具体范围) 在文件中复制粘贴(特定字符范围) 我是如何做到这一点的: 要在需要的位置剪切部分文本(从5到7个字符,从10到14个字符),我使用cut echo 'AAChvhkfiAFAjjfkqAPPMB' | cut --complement -c 5-7,10-14 AAChfifkqAPPMB 但我真的不知道如何复制粘贴文本。例如:
AAChvhkfiAFAjjfkqAPPMB
fkqAAAChfifkqAPPMB
我想:
cut
echo 'AAChvhkfiAFAjjfkqAPPMB' | cut --complement -c 5-7,10-14
AAChfifkqAPPMB
但我真的不知道如何复制粘贴文本。例如:将文本从15个字符复制到18个字符,并将其粘贴到字符1之后(也使用上一个剪切命令)。要获得这样的最终结果:
AAChvhkfiAFAjjfkqAPPMB
fkqAAAChfifkqAPPMB
因此,我必须回答以下问题:
也许是这样的:
$ echo AAChvhkfiAFAjjfkqAPPMB | awk '{ print(substr($1, 0, 14) substr($1, 18) substr($1, 15, 3)) }'
AAChvhkfiAFAjjAPPMBfkq
也许是这样的:
$ echo AAChvhkfiAFAjjfkqAPPMB | awk '{ print(substr($1, 0, 14) substr($1, 18) substr($1, 15, 3)) }'
AAChvhkfiAFAjjAPPMBfkq
在中,可以通过在数组中拆分字符串来使用数组切片:
和切片(打印元素5至7和10至14):
您可以使用太来重新排列阵列
佩尔多克说:
从数组中删除由偏移量和长度指定的元素,并将其替换为列表中的元素(如果有)
请参见中的,您可以通过在数组中拆分字符串来使用数组切片:
和切片(打印元素5至7和10至14):
您可以使用太来重新排列阵列
佩尔多克说:
从数组中删除由偏移量和长度指定的元素,并将其替换为列表中的元素(如果有)
参见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
有关更多详细信息,请参阅。
splice()也可能是一个候选对象。在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
有关更多详细信息,请参阅。
splice()也可能是一个候选者。使用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
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
这里的
1
是什么意思?另外,我只想说清楚:$0=t”“$0
-组合到序列并将其打印出来(打印t,然后打印$0)。但是如果我想在$0
内打印t
,该怎么办?如何在$0
字符串中的特定位置打印t
?Joachim Pileborg的回答bellow使用substr()
-我可以想象使用它来划分最后的$0
并按首选顺序打印,但它们应该是更简单的方法。1
在{…}之外
block的意思是print$0
如果你想在第三个字母后打印t,你可以$3=$3”t
或者$3=sprintf(“%s%s”,$3,t)
我非常喜欢这个解决方案,但问题是:awk:超出程序限制:最大字段数size=32767
-必须使用Joachim Pileborg解决方案(没有最大字段错误)这里的1
是什么意思$0=t”“$0}1'
?我只想说清楚:$0=t”“$0
-组合到序列并打印出来(打印t,然后打印$0)但是如果我想在$0
中打印t
?如何在$0
字符串中的特定位置打印t
?Joachim Pileborg的回答使用substr()
-我可以想象用它来划分最后的$0
并按优先顺序打印,但它们应该是更简单的方法。1
在{…}
块之外意味着打印$0
如果你想在第三个字母后打印t,你可以$3=$3”t
或$3=sprint(“%s%s”,“$3,t)
我非常喜欢这个解决方案,但问题是:awk:超出程序限制:最大字段数size=32767
-必须使用Joachim Pileborg解决方案(没有最大字段错误)