искать конкретный строковый шаблон и рекурсивно заменять его на нижний регистр - PullRequest
0 голосов
/ 23 февраля 2012

Мне нужно найти строку, содержащую Aaa*.c, и заменить ее на aaa*.c в файле рекурсивно.

У меня есть сотни файлов в каталоге, который содержит определенный шаблон (этот .c может быть расширением строки или также между строкой), и я должен заменить такую ​​строку строчными буквами

Я пытаюсь использовать awk '{print tolower ($ 0) или tr, но не могу найти конкретный шаблон и применить его здесь.

Спасибо

Ответы [ 6 ]

5 голосов
/ 23 февраля 2012

Поскольку вы поместили 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 голос
/ 23 февраля 2012

Для этого вы можете использовать sed.

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

Вывод:

aaa.c
bGb
0 голосов
/ 24 февраля 2012

Звучит так, будто вы хотите переименовать файлы. Если это так, вы можете сделать это следующим образом:

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";
      }
   }
'
0 голосов
/ 23 февраля 2012

Это может работать для вас:

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
0 голосов
/ 23 февраля 2012
 echo "Aa.c bB.b CC.c" | perl -ne 's/\b(\w+)(?=\.c)\b/lc $1/eg;print;'
0 голосов
/ 23 февраля 2012

здесь, если скрипт создаст новый файл с существующим файлом, но файлы с * .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);

дайте мне знать, если приведенное выше соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...