2012-08-14 36 views
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 

回答

1

沒有測試過,我不知道是否有在後一個錯誤,但/ folder3 /文件似乎不是在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禁用備用

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 
+0

我不想更換所有字符串在所有的Java文件「MYFILE」的名稱是不一樣的 – lola 2012-08-14 08:26:25

+0

任何機會,現在的編輯適合您的需要? – 2012-08-15 10:44:00

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 

對不起,但我不知道如何使用多行替換。 你可以做兩次。

+0

oyss,我已經更新了我的問題 – lola 2012-08-14 08:37:50

+0

oyss,當我執行腳本時,我得到了:mv:can not stat'* .java':沒有這樣的文件或目錄 sed:-e表達式#1,字符83:未終止' s'命令 – lola 2012-08-14 09:26:57

+0

我已經在linux中測試了代碼,它沒關係。你用什麼操作系統?可能是解析問題?關於單步嘗試它,或者對它進行一些調試。回顯「$ file」來檢查fileanme。 – oyss 2012-08-14 09:47:04

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"; 
} 
+0

嘿bordin,理由一個問題:folder3是不是所有的文件相同的文件夾3的名稱更改所以我怎麼能說讓從folder3的路徑 – lola 2012-08-14 11:33:34

相關問題