【问题标题】:Issue with perl one-liner searching for pipe at end of lineperl one-liner 在行尾搜索管道的问题
【发布时间】:2016-11-11 07:08:31
【问题描述】:

我有一些文件发生了一些错误的正则表达式搜索和替换,它给我留下了以“|”结尾的各种行。我正在尝试创建一个 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):

    $ cat ad.sh.bak2 |perl -ne '/\|$/ && print'
    $ cat ad.sh.bak2 |perl -ne '/\|$ */ && print'
    $

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

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

任何帮助表示赞赏!

【问题讨论】:

  • 好吧,果然,我是个白痴。尝试了您的 s/\|$//gm,Chankey,它对我的​​文件不起作用,但是当我复制粘贴到一个新文件时它起作用了。仔细查看我的测试文件(以及它生成的文件),并意识到它们是未转换为 unix 的 dos 上传(也忽略了 vim 底部的“dos”标志)。所以我的比赛缺少 ^M。一旦我剥离了这些,它就起作用了!谢谢!附: - 我知道“perl -ne '/\|*/ && print' 不做“搜索和替换”,我这样做只是为了测试正则表达式。
  • 我建议查看What should I do when someone answers my question? 如果答案成功,请选择一个并接受它。此外,您还可以对它们进行投票。

标签: regex perl replace pipe


【解决方案1】:

您需要使用搜索和替换。您目前只是匹配正则表达式。

下面的工作正常。

$ 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";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 2017-06-04
    • 1970-01-01
    • 2016-11-22
    • 2014-07-31
    • 2014-05-08
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多