使用perl单行搜索管道末端的问题

时间:2016-11-11 07:08:32

标签: regex perl replace pipe

我有一些文件有一些不好的正则表达式搜索和替换发生在他们身上,它给我留下了各种以“|”结尾的行。我正在尝试创建一个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”在每个“|”之后立即显示$。)

不确定我的正则表达式中我做错了什么。

任何帮助表示赞赏!

1 个答案:

答案 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";
}