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

未测试,不知道post中是否有错误但/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

使用follow shell命令替换它。我不知道你的模式是否一直保持不变。你可以随意更改替换部分。

用替换字符串替换模式:

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

抱歉,但我不知道如何使用多行替换。你可以做两次。

于 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 回答