簡體   English   中英

Perl - 刪除回車並追加下一行

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

這將僅將行尾帶有回車符的行連接到下一行。

每行都以一些終止符序列結束,要么

  • Windows/DOS 上的 CRLF (\\r\\n = 13, 10)
  • Unix 上的 CR (\\n = 13)
  • LF (\\r = 10) 在 MacOS 上

如果某些行沒問題,您應該說文件來自哪個系統或在哪個系統上執行 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.

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