[英]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.