【发布时间】:2013-08-04 16:41:36
【问题描述】:
我有以下文本块(带有 \r\n 或 \n),我想用 sed 查找并删除它。
<?php
/*
*/
?>
我已经尝试了许多令人尴尬的事情(基于许多 SE 答案)来删除这个已经惨遭失败的事情,而不是让水变得浑浊,什么是捕获和删除这种模式的正确方法?对 \n 或 \r\n 使用两个单独的 sed 命令也可以。
好的,我将分享两个糟糕的尝试:
sed 'N;s/<\?php\r\n\/\*\r\n\*\/\r\n\?>//g' file.txt
sed ':a;N;$!ba;s/<\?php\r\n\/\*\r\n\*\/\r\n\?>//g' file.txt
编辑:根据下面的答案,我尝试将其放入 PERL 递归例程中,以便搜索 .php 文件并修改它们。但是 $text 最终未定义。错误是“在 [line "print $text"] 的 print 中使用未初始化的值 $text”
抱歉,我之前没用过perl...
#!/usr/bin/perl
use strict;
use warnings;
my $parent_dir = ".";
my $dir="";
my $file="";
process_dir($parent_dir);
sub process_dir {
my $dir = shift;
print "Processing $dir\n";
opendir(my $SCR , $dir) or die "Can't open $dir: $!";
while( defined (my $file = readdir $SCR) )
{
next if ($file =~ /\.$/ );
if ( $file =~ /\.php$/ ) {
&process_file();
} elsif ( -d "$dir/$file" ) {
print "directory : $dir/$file\n";
process_dir("$dir/$file/");
#next;
#} elsif ( $file
} else {
print "Else :$file\n" if ( -B "$dir/$file");
}
print "file -> $file\n";
}
closedir($SCR);
}
sub process_file{
my $text="";
open(my $fh, '<', "$dir/$file") or die "cannot open file $file";
{
local $/;
$text = <$fh>;
}
close($fh);
print "Before:\n";
print $text;
$text =~ s{ <\?php \s* \r?\n \s* /\* \s* \r?\n \s* \*/ \s* \r?\n \?> \s* \r?\n }{}gmx;
print "After:\n";
print $text;
}
【问题讨论】:
-
哎哟...一定是
sed吗?我不认为这是我用于这项工作的工具。我可能会使用perl,但即使这样也不是特别漂亮。文件有多大?大概不是那么大(更可能是千字节而不是兆字节),所以 slurp 和处理可能是合适的。 -
有些文件是 20-30Kb。但是有 100 个,所以你明白为什么我需要某种工具来递归它们。 Perl 会很好,但我不是很了解。
-
如今,在决定将整个文件放入内存是一个坏主意之前,这些文件必须是数兆字节(甚至可能是千兆字节)。虽然它们仍然以千字节为单位,但它们很容易管理——没有机器会费力地处理它。
标签: sed