1

myfolder で利用可能な一連の Java ファイルについて、次のものを置き換えたいと思います。

ColorTee.testh = new TestH(A,"JavaFileName".class);
ColorTee.testh.addFile(C,"/folder1/folder2/folder3/file","myFile")

と:

ColorTee.testh = new TestH(Z,A,"JavaFileName".class);
ColorTee.testh.addFile(C,/folder3/file,"myfile");

「myfile」がファイルごとに異なることを知っている

import com.soft.test.event;直後に追加

import java.io.File;

試してみました:

#!/bin/bash
for file in *.java
do
  echo 
  sed -i -e "" "$file"
done 
4

4 に答える 4

1

テストされていません。投稿にエラーがあるかどうかはわかりませんが、/folder3/file は Java で有効ではないようです

perl -i.bak -pe '
    s/ColorTee\.testh = new TestH\(A,B\);/ColorTee.testh = new TestH(Z,A,F);/;
    s^ColorTee\.testh\.addFile\(C,"/folder1/folder2/folder3/file","myFile"\)^ColorTee.testh.addFile(C,/folder3/file,"myfile");^;
    s/import java.io.File;/import java.io.File;\nimport com.soft.test.event;/;
  ' *.java

-i.bak => 元のファイルを *.java.bak にバックアップします コマンドで .bak を削除して、バックアップを無効にします

于 2012-08-14T08:07:22.777 に答える
1

次のシェルコマンドを使用して置き換えます。パターンがずっと同じままかどうかはわかりません。置換部分を自由に変更できます。

パターンを置換文字列に置き換えるには:

sed -e s/repexpr/replacement string/ "$file".bak >> "$file";

使用できる改行を追加するために

sed '/import java.io.File;/a\import com.soft.test.event;' "$file"

のようです。

for file in *.java
do  
    mv "$file" "$file".bak
    sed -e s/TestH\(A/TestH\(Z,A/ "$file".bak >> "$file"
    mv "$file" "$file".bak
    sed '/import java.io.File;/a\import com.soft.test.event;' "$file".bak >> "$file"
    rm  "$file".bak
done

申し訳ありませんが、複数行の置換の操作方法がわかりません。2回行う場合があります。

于 2012-08-14T08:18:09.507 に答える
0

特に難しいことはありません:

for file in *.java
do
    sed -i.bak -e \
    "s#import java.io.File;#import java.io.File;\nimport com.soft.test.event;#;s#ColorTee.testh = new TestH(A,\"JavaFileName\".class);#ColorTee.testh = new TestH(Z,A,\"JavaFileName\".class);#g;s#ColorTee.testh.addFile(C,\"/folder1/folder2/folder3/file\",\"myFile\")#ColorTee.testh.addFile(C,/folder3/file,\"$file\");#g" "$file"    
done
于 2012-08-14T08:07:55.397 に答える
0

これはあなたが求めることをします

use strict;
use warnings;

use Tie::File;

my $dir = 'myfolder';
opendir my $dh, $dir or die $!;
my @files = map "$dir/$_", grep /.java$/, readdir $dh;

my @lines = (
  'ColorTee.testh = new TestH',
  'ColorTee.testh.addFile',
  'import java.io.File',
);
do { s/\s+/\\s+/g; s/\./\\./g; } for @lines;

for my $file (@files) {

  tie my @text, 'Tie::File', $file or die $!;

  for (my $i = 0; $i < $#text; $i++) {

    if ($text[$i] =~ /$lines[0]/ and $text[$i+1] =~ /$lines[1]/) {
      $text[$i] =~ s/\(A,\s*"JavaFileName"/(Z,A,"JavaFileName"/;
      $text[$i+1] =~ s|folder1/folder2/folder3/|folder3/|;
      $i += 2;
    }
    elsif ($text[$i] =~ /$lines[2]/) {
      splice @text, $i+1, 0, 'import com.soft.test.event;';
      $i += 1;
    }
  }

  untie @text;
  print "$file updated\n";
}
于 2012-08-14T09:46:21.453 に答える