搜索特定的字符串模式并以递归方式将其替换为小写

时间:2012-02-23 07:37:54

标签: perl bash shell

我必须搜索包含Aaa*.c的字符串,并在递归的文件中用aaa*.c替换它。

我在目录中有数百个文件,其中包含特定模式(此.c可以是字符串的扩展名,也可以是字符串之间的文件),我必须用小写字母替换这样的字符串

我正在尝试使用awk' {print tolower($ 0)或tr但无法搜索特定模式并在此处应用。

由于

6 个答案:

答案 0 :(得分:5)

由于您将Perl放在标签列表中,因此这是一个Perl解决方案

perl -pe "s/(\S+\.c)\b/\L$1/g" myfile > newfile

如果您想就地编辑文件(并丢失原文)

perl -pie "s/(\S+\.c)\b/\L$1/g" myfile

要重命名当前目录中的所有* .c文件,请写入

perl -e "rename $_, qq(\L$_) for glob '*.c'"

要以递归方式遍历所有子目录,请执行此操作

perl -MFile::Find -e "find sub{ rename $_, qq(\L$_) if /\.c$/i }, '.'"

答案 1 :(得分:1)

你可以使用sed。

(echo AaA.c; echo bGb) | sed '/\.c$/y/A-Z/a-z/'

输出:

aaa.c
bGb

答案 2 :(得分:0)

此处如果脚本将使用现有文件创建新文件,但带有* .c的文件将替换为小写字母。

#!/usr/bin/perl
use strict;
my $file='originalfile.txt';
open(CMD,  "<$file") or die "$!";

my $str;
while(<CMD>) {

    if($_ =~ /\.c$/){

        $str.=lc($_);
    } else {
        $str.=$_;
    }

 }
 print $str;
 close(CMD);
 my $file2='newfile.txt';
 open(CMD,  ">$file2") or die "$!";
 print CMD $str;
 close(CMD);

如果上述内容符合您的需求,请告诉我。

答案 3 :(得分:0)

 echo "Aa.c bB.b CC.c" | perl -ne 's/\b(\w+)(?=\.c)\b/lc $1/eg;print;'

答案 4 :(得分:0)

这可能对您有用:

echo -e "Aa.c bB.b CC.c\ndD.d EEE.ca Ff_gG.c" | sed 's/\S*\.c\>/\L&/g'
aa.c bB.b cc.c
dD.d EEE.ca ff_gg.c

答案 5 :(得分:0)

几乎听起来你想要重命名文件。如果是这样,你可以按如下方式进行:

find -name 'Aaa*.c' -type f | perl -nle'
   my $o=$_; my $n=lc($_);
   next if $n eq $o;
   if (-e $n) {
      warn "$o -> $n: Rename failed: Already exists\n";
   } elsif (!rename($o, $n)) {
      warn "$o -> $n: Rename failed: $!\n";
   }
'

或仅使用Perl,

perl -MFile::Find::Rule -e'
   for my $o (
      File::Find::Rule->name("Aaa*.c")->file->in(".")
   ) {
      my $n=lc($_);
      next if $n eq $o;
      if (-e $n) {
         warn "$o -> $n: Rename failed: Already exists\n";
      } elsif (!rename($o, $n)) {
         warn "$o -> $n: Rename failed: $!\n";
      }
   }
'