2013-02-10 104 views
0

我的虛擬文本文件(一個連續的行)看起來是這樣的:文本的剪切和複製粘貼的規定位置

AAChvhkfiAFAjjfkqAPPMB 

我想:

  1. 刪除特定文本的一部分(範圍);
  2. 複製粘貼(特定字符範圍)在文件內。

如何,我這樣做:

爲了削減在所需位置文本的一部分(從5到7個字符&從10到14個字符),我用cut

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

但我真的不知道如何複製粘貼文本。例如:將15到18個字符的文本複製並粘貼在字符1之後(也使用上一個剪切命令)。爲了得到這樣的最終結果:

fkqAAAChfifkqAPPMB 

所以我必須提問:用perl,awk的給定範圍或sed的

  1. 如何閱讀的文本(從...到)&粘貼此文字在特定的位置。
  2. 如何將此文字粘貼與上一個剪切指令相結合,因爲剪切文字後會移動到左側,因此會複製錯誤的文字。

回答

1

也許是這樣的:

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

,你可以使用陣列片,通過在陣列分裂

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

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

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

可以使用splice()得重新安排數組。

的perldoc說:

刪除指定通過OFFSET和從數組LENGTH的元素,以及與列表的元素,如果有的話替換它們。

http://perldoc.perl.org/perldata.html#Slices

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()也可能是候選人。

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 
+1

什麼'1'在這裏意味着'$ 0 = t「」$ 0} 1''? 另外我只是想說清楚:'$ 0 = t「」$ 0' - 結合到序列並打印出來(打印t&然後打印$ 0)。但是如果我想在'$ 0'內打印't'會怎麼樣?如何在'$ 0'字符串內的特定位置打印't'? – PoGibas 2013-02-10 18:21:01

+0

Joachim Pileborg的回答使用'substr()' - 我可以想象使用這個來劃分最終的'$ 0'並以首選順序打印,但是它們應該是更簡單的方法。 – PoGibas 2013-02-10 18:26:17

+1

'{...}'塊外面的'1'表示如果你想在例如打印時打印t,則打印$ 0。在第三封信後,你可以'$ 3 = $ 3''t'或'$ 3 = sprintf('%s%s',$ 3,t)' – Kent 2013-02-10 18:50:50

相關問題