2012-05-13 5 views
1

は私がスペースで区切られた文字列とその代替のシリーズを持っている:一連の文字列置換を実行して簡単に元に戻す方法は?

a123 b312 
c345 d453 

私は右の列のものと左側の列にこれらの文字列を置き換え、そして後に代替品を元に戻すしたいと思います。最初の部分では、sedコマンドs/.../...; s/.../...を作成することができましたが、これは逆転を考慮していないため、入力を大幅に変更する必要があります。 。これを行う便利な方法はありますか?

いくつかのサンプルプログラムがリストされていますが、win/linの場合は無料です。

+2

あなたドンので、あなたは、高品質な答えを得るためにするためにあなたの質問はまだあまりにも曖昧である:

script.pl 0 replace.txt input.txt > output.txt 

変更を逆にするにはあなたがしようとしていることについて十分な情報を述べていない。これらの置換えを別のドキュメントで実行しようとしているのですか、ここに示す情報のみを操作しようとしていますか?差し替えは可逆的であることは保証されません。たとえば、2番目の列の2つの項目が同一である場合、または置換が行われる前に右側の列にある項目が入力に既に表示されている場合を考えてみましょう。これらの2つの列を交換するだけであれば、はるかに簡単です。 –

+0

ファイルは1つだけですか?最初にファイルのコピーを作成し、置き換えてから、後でコピーからファイルを復元することはできますか? –

+0

私の入力(別の文書で)は可逆的であることが保証されています。 – user490735

答えて

0
use strict; 
use warnings; 

unless (@ARGV == 3) { 
    print "Usage: script.pl <reverse_changes?> <rfile> <input>\n"; 
    exit; 
} 
my $reverse_changes = shift; 
my $rfile = shift; 
open my $fh, "<", $rfile or die $!; 
my %reps = map split, <$fh>; 

if ($reverse_changes) { 
    %reps = reverse %reps; 
} 

my $rx = join "|", keys %reps; 

while (<>) { 
    s/\b($rx)\b/$reps{$1}/g; 
    print; 
} 

置換を囲む単語境界チェック\bは、部分一致を防止します。 a12345b31245に置き換えてください。 $rxでは、置換文字にメタ文字が存在する場合は、その文字をエスケープすることができます。

用途:

置換を実行するには:

script.pl 1 replace.txt output.txt > output2.txt 
1

テキストエディタは「元に戻す」機能を提供しますが、コマンドラインユーティリティでは機能しません。置き換えを行うためのスクリプトを書いてから、同じことを逆にするために置換ファイルを逆にすることができます。

ここにreplacements.txt '内の代替品のシリーズを取り、スクリプトの入力に対してそれらを実行するスクリプトです:あなたは「repl.pl」としてこのファイルを保存した場合

#!/usr/bin/perl -w 

use strict; 

open REPL, "<replacements.txt"; 
my @replacements; 
while (<REPL>) { 
    chomp; 
    push @replacements, [ split ]; 
} 
close REPL; 

while (<>) { 
    for my $r (@replacements) { s/$r->[0]/$r->[1]/g } 
    print; 
} 

、そしてあなたがあなたのを保存

perl repl.pl input.txt >output.txt 

は、あなたの置換が「逆replacements.txt」をファイルに変換するには、単純なawkコマンドを使用することができます:

をあなたはこのようにそれを使用することができ、「replacements.txt」として上記のファイル
awk '{ print $2, $1 }' replacements.txt >reverse-replacements.txt 

次に、順方向スクリプトの代わりに逆方向置換ファイルを使用するようにPerlスクリプトを変更します。

関連する問題