如何使用 Perl 从文件中删除某一行?

如何使用 Perl 从文件中删除某一行?

我该如何删除这行

[[ -f /var/tmp/Li.ksh ]] && /var/tmp/Li.ksh

通过 ksh 脚本中的 perl 命令从文件中获取?

我试过:

perl -i -pe "s/[[ -f /var/tmp/Li.ksh ]] && /var/tmp/Li.ksh//" /etc/tl.conf 

但我得到了:

Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE [ -f / at -e line 1.

答案1

[./正则表达式中具有特殊含义。您必须对它们进行转义:

perl -i -pe "s/\[\[\ -f\ \/var\/tmp\/Li\.ksh\ \]\]\ &&\ \/var\/tmp\/Li\.ksh//" 

编辑:请注意,这不会删除该行,而只会删除正则表达式中的文本。如果是整行,则会保留一个空白行。

更易读的版本(使用括号来定义正则表达式,这样您就不必转义/):

perl -i -pe "s{\[\[ -f /var/tmp/Li.ksh \]\] && /var/tmp/Li\.ksh}{}"

但是,既然您询问的是 shell 脚本,为什么要使用 Perl 而不是grep -v( --invert-match)?

grep -v '[[ -f /var/tmp/Li.ksh ]] && /var/tmp/Li.ksh' /etc/tl.conf

答案2

提交时间早于

$ cat t.txt
aaa
[[ -f /var/tmp/Li.ksh ]] && /var/tmp/Li.ksh
bbb

命令(使用 \Q 忽略正则表达式中特殊字符的特殊性)

$ perl -i -lne 'print unless m{\Q[[ -f /var/tmp/Li.ksh ]] && /var/tmp/Li.ksh}' t.txt

之后归档

$ cat t.txt
aaa
bbb

注意:如果您希望 perl 在更改之前备份文件,请
更改-i为。-i.bak

您也可以通过这种方式进行操作(使用简单的文本相等性测试,无需正则表达式)。

$ perl -i -lne 'print unless $_ eq q([[ -f /var/tmp/Li.ksh ]] && /var/tmp/Li.ksh)' t.txt

答案3

我认为我找到了一种对你有用的东西,基本上,我正在读取当前文件并输出文件的“修改”版本,减去匹配的行(问题中提到的行)。当我测试它时,它似乎对我有用。请不要尝试这个,除非你做了备份,以防出错。

这是代码,请根据您的需要更改文件名,然后运行脚本,它“应该”可以工作。

虽然不是很漂亮但是却很管用。

#!/usr/bin/perl
use strict;
use warnings;

my $in_file = "sample.txt";
my $out_file = "control.txt";

open INFILE , "<", $in_file;
open OUTFILE,  ">", $out_file;

my @array;

while (<INFILE>) {

    push @array, $_;

}

foreach my $line (@array) {

    if ( $line =~ /(\"\[\[\s*\-f\s*\/var\/tmp\/Li\.ksh\s*\]\]\s*\&\&\s*\/var\/tmp\/Li.ksh\")/xm ) {

        print "I have ommited the following line $1\n";

    } else {

        print OUTFILE "$line";

    }

}

close INFILE;
close OUTFILE;

相关内容