2

テキストファイル内

Letter A = "AAA"
Letter B = "BBB"

私は試してみます:

perl -p -e 's/(Letter A \=)(.*\")(\n+)(Letter B \=)/$1$2$3$4/g' text

しかし、それは機能しません。問題は後のよう\nです。

何か案が?

実は言葉を交換したいのですが、どうすればいいのでしょうか?
差出人:
レターA="AAA"
レターB="BBB"
宛先:
レターA="BBB"
レターB="AAA"

2行の間に他の単語がある場合。他の解決策はありますか?

ABCABC
レターA="BBB"
レターB="AAA"
DSAASTRQWTR
レター
C="DDD"
レターD="CCC"
SDAGER
LPITET

4

3 に答える 3

6

-p入力を行に分割します。これは、パターンが\n見ているテキストの最後以外に が表示されないことを意味します。複数行のマッチングを行いたい場合は、実際のスクリプトを作成するか、入力レコードの区切り文字を変更して、行が分割されないようにする必要があります (おそらく-0777「slurp」モードを使用するため)。

perl -0777 -p -e 's/(Letter A =)(.*")(\n+)(Letter B =)/$1 Hello$2$3$4 Hello/' test2
Letter A = Hello "AAA"
Letter B = Hello "BBB"
于 2012-04-24T07:16:36.320 に答える
0

それを小さなプログラムに入れると、このようなことができます。上部のコメントアウトされた部分は、複数の行のペアで機能することを示しています。ただし、私が作成した方法では、テキスト ファイルをパイプする必要があります。

# my $text = qq~Letter A = "AAA"
# Letter B = "BBB"
# Letter C = "CCC"
# Letter D = "DDD"~;
# 
# my @temp = split /\n/, $text;
my @temp = <>;

for (my $i=0; $i <= $#temp; $i+=2) {
  $temp[$i] =~ m/"(\w+)"/;
  my $w1 = $1;
  $temp[$i+1] =~ s/"(\w+)"/"$w1"/;
  my $w2 = $1;
  $temp[$i] =~ s/"$w1"/"$w2"/;
}
print join "\n", @temp;

出力:

Letter A = "BBB"
Letter B = "AAA"
Letter C = "DDD"
Letter D = "CCC"

間に他の行がある場合、コードは次のようになります。

my $text = qq~Letter A = "AAA"
testtesttest
Letter B = "BBB"
loads 
of text
Letter C = "CCC"
Letter D = "DDD"
Letter E = "EEE"

Letter F = "FFF"~;

my @temp = split /\n/, $text;
# my @temp = <>;

my $last_index; # use this to remember where the last 'fist line' was
for (my $i=0; $i <= $#temp; $i+=1) {
  if (!defined $last_index) {
    # if we have not find a 'first line' yet, look if this is it
    $last_index = $i if $temp[$i] =~ m/"(\w+)"/;
  } elsif ($temp[$i] =~ m/"(\w+)"/) {
    # otherwhise if we already have a 'first line', check if this is a 'second line'
    $temp[$last_index] =~ m/"(\w+)"/; # use the 'first line'
    my $w1 = $1; 
    $temp[$i] =~ s/"(\w+)"/"$w1"/; # and the current line
    my $w2 = $1;
    $temp[$last_index] =~ s/"$w1"/"$w2"/;
    $last_index = undef; # remember to reset the 'first line'
  }
}
print join "\n", @temp;

出力:

Letter A = "BBB"
testtesttest
Letter B = "AAA"
loads 
of text
Letter C = "DDD"
Letter D = "CCC"
Letter E = "FFF"

Letter F = "EEE"
于 2012-04-24T08:40:16.620 に答える
-1

これが必要だと思います。それを試してみてください

perl -pe 's/$\\n/Hello/g' filename

出力

[tethomas@~/Perl]cat t
Letter A = "AAA"
Letter B = "BBB"
[tethomas@~/Perl]perl -pe 's/$\\n/Hello/g' t
Letter A = "AAA"HelloLetter B = "BBB"Hello
于 2012-04-24T07:49:18.283 に答える