Regex perl one liner在管线末端搜索管道时出现问题
我有一些文件发生了一些错误的正则表达式搜索和替换,它给我留下了以“|”结尾的各行。我正试图创建一个perl oneliner来解决这个问题,但似乎无法匹配行末尾的“|” 创建了一个仅包含问题行的示例文件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
$ 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";
}