Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl one liner在管线末端搜索管道时出现问题_Regex_Perl_Replace_Pipe - Fatal编程技术网

Regex perl one liner在管线末端搜索管道时出现问题

Regex perl one liner在管线末端搜索管道时出现问题,regex,perl,replace,pipe,Regex,Perl,Replace,Pipe,我有一些文件发生了一些错误的正则表达式搜索和替换,它给我留下了以“|”结尾的各行。我正试图创建一个perl oneliner来解决这个问题,但似乎无法匹配行末尾的“|” 创建了一个仅包含问题行的示例文件 $ cat ad.sh.bak2 echo "dbconfig Db side ..." | date | echo "ALERT !!! THIS IS PRODUCTION SERVER" | echo "ERROR: Environment cannot be star

我有一些文件发生了一些错误的正则表达式搜索和替换,它给我留下了以“|”结尾的各行。我正试图创建一个perl oneliner来解决这个问题,但似乎无法匹配行末尾的“|”

创建了一个仅包含问题行的示例文件

$ cat ad.sh.bak2
    echo "dbconfig Db side ..."  |
date |
   echo "ALERT !!! THIS IS PRODUCTION SERVER" |
  echo "ERROR: Environment cannot be started! (retvalue=$retvalue)" |
$
已尝试以下操作(将下面的一行更改为仅在匹配项上打印,而不是在我的正常s///g上打印):

如果我去掉“$”,它将与行匹配(以及其他我不想要的行)。我已经确认“|”后面没有空格或不可打印字符(vim“set list”在每个“|”)后面显示$

不知道我在正则表达式中做错了什么


感谢您的帮助

您需要使用搜索和替换。您当前正在匹配正则表达式

下面的工作很好

$ 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";
}
#/usr/bin/perl
严格使用;
使用警告;
我的$filename='test';
my$outputfile='test.out';
打开(my$fh,“,$outputfile)或死亡$!;
while(我的$line=){
chomp$行;
$line=~s/(.*)\\124;$/$1/gm;
打印$ofh“$line\n”;
}

好吧,正如所料,我是个白痴。尝试了你的s/\\\$//gm、Chankey,但它在我的文件上不起作用,但在我复制粘贴到新文件时起作用。仔细查看了我的测试文件(以及生成它的文件),发现它们是dos上传的,没有转换到unix(也忽略了vim底部的“dos”标志)。所以我的对手错过了^M。一旦我剥掉这些,它就成功了!谢谢另外,我知道“perl-ne'/\\\\\*/&&print”不会执行“搜索和替换”,我这样做只是为了测试正则表达式。我建议看看答案是否正确,选择一个并接受它。此外,您也可以对它们进行投票。
#!/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";
}