我该如何删除这行
[[ -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;