我有一些文件有一些不好的正则表达式搜索和替换发生在他们身上,它给我留下了各种以“|”结尾的行。我正在尝试创建一个perl oneliner来解决问题,但似乎无法匹配“|”在行尾。
创建了一个只有问题行的示例文件。
d.dy
尝试了以下操作(将下面的单行更改为仅在匹配时打印而不是我的正常s /// g):
$ cat ad.sh.bak2
echo "dbconfig Db side ..." |
date |
echo "ALERT !!! THIS IS PRODUCTION SERVER" |
echo "ERROR: Environment cannot be started! (retvalue=$retvalue)" |
$
如果我摆脱了“$”,它会匹配线条(以及其他我不想要的线条)。我已确认“|”后面没有空格或不可打印的字符(vim“set list”在每个“|”之后立即显示$。)
不确定我的正则表达式中我做错了什么。
任何帮助表示赞赏!
答案 0 :(得分:2)
您需要使用搜索和替换。您目前只是匹配正则表达式。
以下工作正常。
$ cat test | perl -pe 's/\|$//'
echo "dbconfig Db side ..."
date
echo "ALERT !!! THIS IS PRODUCTION SERVER"
echo "ERROR: Environment cannot be started! (retvalue=$retvalue)"
但是,您不需要将cat传递给perl。只需将文件名传递给oneliner。
假设文件名是test,下面是内容
$ cat test
echo "dbconfig Db side ..." |
date |
echo "ALERT !!! THIS IS PRODUCTION SERVER" |
echo "ERROR: Environment cannot be started! (retvalue=$retvalue)" |
下面是删除|的Perl oneliner在每一行的末尾
$ perl -pi -e 's/\|$//gm' test
更换后的文件内容
$ cat test
echo "dbconfig Db side ..."
date
echo "ALERT !!! THIS IS PRODUCTION SERVER"
echo "ERROR: Environment cannot be started! (retvalue=$retvalue)"
如果你喜欢一个程序而不是oneliner,那么下面就可以了。
#!/usr/bin/perl
use strict;
use warnings;
my $filename = 'test';
my $outputfile = 'test.out';
open (my $fh, "<", $filename) or die $!;
open (my $ofh, ">", $outputfile) or die $!;
while(my $line = <$fh>){
chomp $line;
$line =~ s/(.*)\|$/$1/gm;
print $ofh "$line\n";
}