簡體   English   中英

Perl(或其他)-^ M問題

[英]Perl (or something else) - ^M problem

我正在嘗試在Perl中文本文件的每個非空行的末尾添加"",

perl -pi -e 's/^(.+)$/\"$1\",/g' something.txt

它在每個非空行的開頭都添加了" ,但是我有問題",

輸入示例:

bla
bla bla
blah

我得到的輸出是:

"bla
",
"bla bla
",
"blah
",

那就是我真正想要輸出

"bla",
"bla bla",
"blah",

我該如何解決?

編輯:我現在在vim中打開了我的輸出文件(我之前在kwrite中打開了它,所以它不可見),並且我注意到vim在每個",之前顯示^M ", -我不知道代碼中添加了什么。

看起來像是行尾問題-您是否在Windows中編輯文件? 試試dos2unix

如果您不想使用dos2unix,則可以匹配\\ r:

perl -pi -e 's/^(.+)\r$/\"$1\",/g'

問題是,如果文件中有返回值,它將在。*中匹配它們,因此您將獲得:

"bla^M",
"bla bla^M",
"blah^M",

您的數據文件必須起源於Windows,Windows使用CRLF作為行定界符,而不僅僅是LF。 這意味着您的文本文件如下所示:

bla[CR][LF]bla bla[CR][LF]blah[CR][LF]

您可以使用od -c something.txt進行驗證。

$ od -c something.txt
0000000    b   l   a  \r  \n   b   l   a       b   l   a  \r  \n   b   l
0000020    a   h  \r  \n                                                
0000024

在Unix或Linux下,它將顯示如下:

bla\r
bla bla\r
blah\r

當perl進行替換時,結果如下:

"bla\r",
"bla bla\r",
"blah\r",

當您獲得結果時,您將看到:

"bla
",
"bla bla
",
"blah
",

容易做的是使用dos2unix將行尾轉換為Unix格式,然后您的腳本將按預期運行。

在使用CRLF文本文件的系統上,Perl使用IO層將CRLF過濾為僅在腳本中看到LF的位置。 但是,如果您在通常不使用CRLF的系統上打開CRLF文件,則可以通過多種方式啟用CRLF轉換。

您可以使用binmode 我在這里使用OO接口,因為我認為它更干凈,YMMV:

use IO::File;

open( my $fh, '<', 'winfile.txt' ) 
    or die "Oh poo - $!\n";

$fh->binmode(':crlf');

您還可以使用經過調整的打開:

open( my $fh, '<:crlf', 'winfile.txt' ) 
    or die "Oh poo - $!\n";

或者,對於單行代碼,您可以設置PERLIO環境變量(請參見PerlIO ):

PERLIO=crlf perl -pi -e 's/^(.+)$/\"$1\",/g' something.txt

當然,這種方法會將CRLF行尾保留在處理后的文件中-可能不是您想要的。

sed 's/.\{1,\}/"&",/'

這是在python或bash之前詢問的-在行首添加“,在行尾添加”

由於您想在開始和結束時添加,因此您無需用正則表達式替代該簡單任務。

perl -ne 'chomp;print "\"".$_."\",\n"' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM