我必须搜索包含Aaa*.c
的字符串,并在递归的文件中用aaa*.c
替换它。
我在目录中有数百个文件,其中包含特定模式(此.c可以是字符串的扩展名,也可以是字符串之间的文件),我必须用小写字母替换这样的字符串
我正在尝试使用awk' {print tolower($ 0)或tr但无法搜索特定模式并在此处应用。
由于
答案 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";
}
}
'