2009-05-21 63 views
0

我有一個項目,其中包含文件夾,子文件夾和文件。我需要在每個文件中用Bond代替Masi這個詞。無法通過Sed/Python/Perl替換給定文件夾內容中的單詞

我運行名爲下面的sed腳本失敗

s/Masi/Bond/ 
在巖組

替代由

sed -f PATH/replace PATH2/project/** 

它給我的所有文件,也將那些不具有罵死,作爲輸出。

Sed不一定是該任務的最佳工具。 我對Python和Perl感興趣。

你會如何在Sed/Perl/Python,中進行替換,以便只更改文件內容?

+0

是否要替換文件名或文件內容的字符串? – fmarc 2009-05-21 20:01:28

+0

是什麼讓你覺得sed可以重命名目錄?你爲什麼不使用「mv」或其他重命名文件的命令? – 2009-05-21 20:04:15

+0

@fmarc:我想替換文件內容中的字符串,而不是文件名。 – 2009-05-21 20:05:50

回答

12

要更換,並在當前目錄中的所有文件子目錄字

perl -p -i -e 's/Masi/Bond/g' $(grep -rl Masi *) 

上面不會有,如果你有空間在工作文件名。更安全的事:

find . -type f -exec perl -p -i -e 's/Masi/Bond/g' {} \; 

或Mac的具有文件名中空間

find . -type f -print0 | xargs -0 perl -p -i -e 's/Masi/Bond/g' 

說明

  • -p表示打印或死亡
  • -i表示「不創建任何備份文件「
  • -e允許您運行perl c頌在命令行
3

爲什麼不只是通過-i選項(man sed)sed並完成它呢?如果它沒有在文件中找到Masi,則該文件將被重寫而不做任何修改。或者我錯過了什麼?

如果你不想內嵌替換文件的內容(這是什麼-i會做),你可以做的正是你現在的樣子,但在它的面前拋出一個grep & xargs

grep -rl Masi PATH/project/* | xargs sed -f PATH/replace 

很多選擇,但是做不是寫了一個完整的perl腳本(我會給出一行代碼);)。 findgrepsed,xargs等將永遠更靈活,恕我直言。

在迴應評論:

grep -rl Masi PATH/project/* | xargs sed -n -e '/Masi/ p' 
+0

@ Sean:在運行命令之前,你怎麼看到哪一行會被改變? – 2009-05-23 15:46:11

0

一個解決方案在Windows測試

需要CPAN模塊文件:: Slurp的。將使用標準Unix shell通配符。像./replace.pl PATH/replace.txt PATH2 /替換*

#!/usr/bin/perl 

use strict; 
use warnings; 
use File::Glob ':glob'; 
use File::Slurp; 
foreach my $dir (@ARGV) { 
    my @filelist = bsd_glob($dir); 
    foreach my $file (@filelist) { 
    next if -d $file; 
    my $c=read_file($file); 
    if ($c=~s/Masi/Bond/g) { 
     print "replaced in $file\n"; 
     write_file($file,$c); 
    } else { 
     print "no match in $file\n"; 
    } 
    } 
} 
3

重命名文件的完整文件夾:

use warnings; 
use strict; 
use File::Find::Rule; 

my @list = File::Find::Rule->new()->name(qr/Masi/)->file->in('./'); 

for(@list){ 
    my $old = $_; 
    my $new = $_; 
    $new =~ s/Masi/Bond/g; 
    rename $old , $new ; 
} 

在文件

use warnings; 
use strict; 
use File::Find::Rule; 
use File::Slurp; 
use File::Copy; 

my @list = File::Find::Rule->new()->name("*.something")->file->grep(qr/Masi/)->in('./'); 

for(@list){ 
    my $c = read_file($_); 
    if ($c =~ s/Masi/Bond/g;){ 
    File::Copy::copy($_, "$_.bak"); # backup. 
    write_file($_ , $c); 
    } 
} 
  • strict更換琴絃(核心) - 限制不安全構造的Perl雜注
  • warnings(核心) - Perl的編譯控制可選警告
  • File::Find::Rule - 替代的接口文件::查找
  • File::Find(核心) - 遍歷目錄樹。
  • File::Slurp - 高效閱讀/寫作完成文件
  • File::Copy(核心) - 複製文件或文件句柄
0
import glob 
import os 

# Change the glob for different filename matching 
for filename in glob.glob("*"): 
    dst=filename.replace("Masi","Bond") 
    os.rename(filename, dst) 
相關問題