2014-11-06 136 views
1

這是使用GNU sed版本4.2.1,但我也嘗試過awk和Perl,但沒有任何成功。嘗試替換文件中的 r n n但不是 r n

我有一個由COBOL程序(在Linux上)生成的文件,它有什麼可以被認爲是非標準的CRLF而不是LF(CRLF當然是Windows行結束符),但這就是我需要保留 - 什麼CRLF停留。

因此\r\n序列停留。

我需要替換的是偶爾\r\n\n序列與\r\n\r\n而不會干擾其他任何事情。

我必須匹配這個文件,我使用diff生成BSD或SCO或什麼的原始文件。

這不工作,我希望第一/n是越來越受Sed剝離作爲行終止

sed -e 's/\r\n\n/\r\n\r\n/g' infile > outfile 

我試圖hex 0x也是雙逃逸太

感謝您的任何建議

回答

2

我建議你在任何還沒有之前的LF之前添加一個CR。

在這種改變中的數據文件時,它會是這個樣子

use strict; 
use warnings; 

use open IO => ':raw'; 

my $data = do { 
    local $/; 
    <>; 
}; 

$data =~ s/ (?<!\r) (?=\n) /\r/xg; 

print $data; 

,你可以運行它像

perl add_cr.pl myfile > newfile 

,或者,如果你想修改程序你的文件在原地(在測試之後)你可以使用

perl -i add_cr.pl myfile 
+0

非常感謝鮑羅廷,即Perl腳本工作正常-appreciate它 – Easycoder 2014-11-07 00:21:32

+0

我希望您的解決方案會比'S/\慢R'\ n/\ r \ n/g'。 – ikegami 2014-11-07 03:57:01

+0

S/\ r \ n/\ r \ n /克GNU 4.2.1不起作用的sed - ?或其他任何形式與飼料辦,換行等,據我可以看到(在我的方式我試圖使用它)。我使用sed -e的/ \ r?\ n/\ r \ n/g'file1> file2,而file2與file1沒有區別。它可能在Perl中工作。速度不是一個考慮因素。 – Easycoder 2014-11-07 12:51:21

0

只要使用這個Perl的一行代碼:

perl -pe "s/\R/\r\n/g" <input.txt >output.txt 

魔術這裏是關於\R其被Perl接受任何新線組合匹配:\n,單獨\r\n\r。據我所知,\R是Perl-only - sedawk不支持。

+0

謝謝MVP -worked – Easycoder 2014-11-07 23:24:32

+0

@Easycoder:更好的方式來說,謝謝你,這裏只是簡單地upvote。而最重要的是,你應該接受你認爲最適合你 – mvp 2014-11-08 07:56:15

2

sed是一個面向行的工具,blah\r\n\n將是一行blah\r後跟一個空行。因此,添加\r任何空行:

sed 's/^$/\r/' infile > outfile 
+0

感謝格倫的回答,爲我工作 – Easycoder 2014-11-07 20:37:02

+0

請仔細閱讀https://stackoverflow.com/help/someone-answers – 2014-11-07 20:38:53

0

與GNU AWK多焦RS:

awk -v RS='\r\n\n' -v ORS='\r\n\r\n' '1' file 
+1

作品也很好,感謝埃德 – Easycoder 2014-11-07 22:33:14

0

嘗試unix2dos工具:它處理所有的UNIX/DOS /和UNIX/DOS的混合案例。 注意:dos2unix也是一個很好的工具。

覆蓋:

unix2dos your-file 

創建新的文件:

unix2dos < your-file > your-new-file 
+0

也工作,我只是沒有考慮到它! – Easycoder 2014-11-07 22:36:01

相關問題