[英]Perl - remove carriage return and append next line
如果我在其他良好的文件中有一個記錄,其中有回車符怎么辦。
前任:
1,2,3,4,5 ^M
,6,7,8,9,10
我想成功
1,2,3,4,5,6,7,8,9,10
一般來說,如果你想去掉一個在末尾有一個雜散換行符的字符串,你可以在它上面使用chomp
(注意你可以傳遞一個左值,所以將它包裹在一個賦值中是合法的):
my $string = $string2 = "blah\n";
chomp $string;
# this works too:
chomp(my $string3 = $string2);
請注意,如果字符串尾隨"\\r\\n"
,則 chomp 也不會采用\\r
,除非您修改$/
。
因此,如果所有這些都太復雜,並且您需要刪除所有出現的\\n
、 \\r\\n
和\\r
(也許您正在同時處理來自各種架構的行?),您可以回退到好老tr
:
$string =~ tr/\r\n//d;
假設我們有一個包含 ctrl-M(在某些平台上也稱為\\r
)的文件:
$ cat input 1,2,3 4,5,6 ,7,8,9 10,11,12
這是明確的od
:
$ od -c input 0000000 1 , 2 , 3 \n 4 , 5 , 6 \r \n , 7 , 0000020 8 , 9 \n 1 0 , 1 1 , 1 2 \n 0000035
刪除每個有問題的字符並通過運行將其與下一個字符連接起來
$ perl -pe 's/\cM\cJ?//g' input 1,2,3 4,5,6,7,8,9 10,11,12
或重定向到一個新文件
$ perl -pe 's/\cM\cJ?//g' input >updated-input
或將其覆蓋(加上input.bak
的備份)
$ perl -i.bak -pe 's/\cM\cJ?//g' input
當文件以 ctrl-M 而不是 ctrl-J 結尾時,將\\cJ
可選處理。
s/[\\r\\n]//g
僅當您想將一行與下一行合並時才執行此操作。
假設回車正好在換行之前:
perl -pi.bak -e 's/\r\n//' your_file_name
這將僅將行尾帶有回車符的行連接到下一行。
每行都以一些終止符序列結束,要么
如果某些行沒問題,您應該說文件來自哪個系統或在哪個系統上執行 perl 腳本,或者風險是刪除行的每一端並合並所有程序行...
由於 ^M 是 CR 字符,如果您在一行的末尾看到這樣的字符而其他行沒有什么特別的,那么您可能正在使用某種 Unix(Linux ?),並且某些復制/粘貼已經污染了一行在行尾附加 \\r。
如果是這種情況:
perl -pi -e 's/\r\n$//g' filetomodify
會做的伎倆,只合並包含 CR 和 LF 的行與下一行,其他行不受影響。
需要更多有關基礎數據的信息以及您對carriage return
的定義是什么。 數據是在Linux還是Windows? 真的,你的意思是回車/換行,還是換行?
$text =~ tr/\\r//;
→ 這是淘汰回車的最快方法$text =~ tr/\\n//;
→ 這是更改換行符的最快方法$test =~ s/\\n//s;
→ 這可能就是您要查找的內容,這會使文本顯示為一行並刪除內部\\n
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.