2016-11-11 14 views
0

末搜索管我有一些文件有一些壞的正則表達式搜索和替換髮生在自己身上,它給我留下了,在一個結束各種線「|」。我試圖創建一個perl oneliner來解決這個問題,但似乎無法匹配「|」在行末。問題用Perl的一行在行

創建只有在它的問題行的示例文件。

$ 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」在每個「|」之後立即顯示$)。

不知道什麼,我在我的正則表達式做錯了。

任何幫助表示讚賞!

+0

好的,正如所料,我是個白癡。嘗試了你的s/\ | $ // gm,Chankey,並且它在我的文件上不起作用,但是當我將它複製到一個新文件時,它確實做到了。仔細查看了我的測試文件(以及它生成的文件),並意識到它們是dos上傳的,尚未轉換爲unix(忽略了vim底部的「dos」標誌)。所以我的比賽失蹤了^ M。 一旦我剝去那些,它的工作!謝謝! P.S. - 我知道「perl -ne'/ \ | */&& print'不會執行」搜索和替換「,我只是爲了測試正則表達式。 –

回答

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)" 

但是,你不需要管貓到Perl。只需將文件名傳遞給oneliner即可。

假設文件名是測試,下面是內容

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