用于替换一组文件中的一组字符串的脚本

时间:2012-08-14 07:57:39

标签: perl shell

对于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 个答案:

答案 0 :(得分: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命令以禁用备份

答案 1 :(得分: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
抱歉,但我不知道如何使用多行更换。 你可以做两次。

答案 2 :(得分: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

答案 3 :(得分: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";
}