다음 명령은 Solaris에서 잘 작동합니다(마지막 문자가 ":"인 경우에만 줄 삭제).
sed -e '/:$/d' < foo > foo.new
Perl에서 동일한 작업을 수행하는 방법은 무엇입니까? (새 파일을 만들고 싶지 않기 때문에 그 이유)
perl -i -pe 's/:$/d' foo
Substitution replacement not terminated at -e line 1.
답변1
다음과 비슷한 것:
perl -ne '/:$/'가 아니면 인쇄합니다.
perl -ne '인 경우 인쇄 !/:$/'
perl -ne '!/:$/ && 인쇄'
두 가지 모두 임시 파일을 만들고 원본을 교체하여 작동합니다 sed -i
. perl -i
이를 피하려면 다음을 사용하십시오 ed
.
ed 파일 <<'EOF' g/:$/d wq EOF
답변2
Perl에는 sed-perl 변환기가 함께 제공됩니다.s2p
. 관심을 끌기 위해 다음을 s2p '/:$/d'
제공합니다.
#!/usr/local/bin/perl -w
eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
if 0;
$0 =~ s/^.*?(\w+)[\.\w+]*$/$1/;
use strict;
use Symbol;
use vars qw{ $isEOF $Hold %wFiles @Q $CondReg
$doAutoPrint $doOpenWrite $doPrint };
$doAutoPrint = 1;
$doOpenWrite = 1;
# prototypes
sub openARGV();
sub getsARGV(;\$);
sub eofARGV();
sub printQ();
# Run: the sed loop reading input and applying the script
#
sub Run(){
my( $h, $icnt, $s, $n );
# hack (not unbreakable :-/) to avoid // matching an empty string
my $z = "\000"; $z =~ /$z/;
# Initialize.
openARGV();
$Hold = '';
$CondReg = 0;
$doPrint = $doAutoPrint;
CYCLE:
while( getsARGV() ){
chomp();
$CondReg = 0; # cleared on t
BOS:;
# /:$/d
if( m /:$/s )
{ $doPrint = 0;
goto EOS;
}
EOS: if( $doPrint ){
print $_, "\n";
} else {
$doPrint = $doAutoPrint;
}
printQ() if @Q;
}
exit( 0 );
}
Run();
# openARGV: open 1st input file
#
sub openARGV(){
unshift( @ARGV, '-' ) unless @ARGV;
my $file = shift( @ARGV );
open( ARG, "<$file" )
|| die( "$0: can't open $file for reading ($!)\n" );
$isEOF = 0;
}
# getsARGV: Read another input line into argument (default: $_).
# Move on to next input file, and reset EOF flag $isEOF.
sub getsARGV(;\$){
my $argref = @_ ? shift() : \$_;
while( $isEOF || ! defined( $$argref = <ARG> ) ){
close( ARG );
return 0 unless @ARGV;
my $file = shift( @ARGV );
open( ARG, "<$file" )
|| die( "$0: can't open $file for reading ($!)\n" );
$isEOF = 0;
}
1;
}
# eofARGV: end-of-file test
#
sub eofARGV(){
return @ARGV == 0 && ( $isEOF = eof( ARG ) );
}
# makeHandle: Generates another file handle for some file (given by its path)
# to be written due to a w command or an s command's w flag.
sub makeHandle($){
my( $path ) = @_;
my $handle;
if( ! exists( $wFiles{$path} ) || $wFiles{$path} eq '' ){
$handle = $wFiles{$path} = gensym();
if( $doOpenWrite ){
if( ! open( $handle, ">$path" ) ){
die( "$0: can't open $path for writing: ($!)\n" );
}
}
} else {
$handle = $wFiles{$path};
}
return $handle;
}
# printQ: Print queued output which is either a string or a reference
# to a pathname.
sub printQ(){
for my $q ( @Q ){
if( ref( $q ) ){
# flush open w files so that reading this file gets it all
if( exists( $wFiles{$$q} ) && $wFiles{$$q} ne '' ){
open( $wFiles{$$q}, ">>$$q" );
}
# copy file to stdout: slow, but safe
if( open( RF, "<$$q" ) ){
while( defined( my $line = <RF> ) ){
print $line;
}
close( RF );
}
} else {
print $q;
}
}
undef( @Q );
}
답변3
마지막 문자가 ":"인 경우 줄 삭제
perl -i -nle'/:$/||print' myfile
perl -i -nle'print unless /:$/' myfile #same thing
이동http://perldoc.perl.org/perlrun.html-i -n -l 및 -e에 대한 설명은 다음과 같습니다.