在將它們放入資料庫之前,我必須清理幾個 csv 檔案,其中一些檔案在行的中間有一個意外的換行符,因為該行應該總是以一個數字結尾,我設法用這個襯里修復檔案:
perl -pe 's/[^0-9]\r?\n//g'
雖然它確實有效,但它也替換了換行符之前的最后一個字符
foob
ar
變成
fooar
是否有任何我可以呼叫的 liner perl 將遵循相同的規則而不替換換行符之前的最后一個字符
uj5u.com熱心網友回復:
也可以使用作為斷言且不會使用字符的否定后向查看。
(?<!\d)\R
\d是數字的縮寫\R匹配任何換行序列
在 regex101 看到這個演示
uj5u.com熱心網友回復:
只需捕獲最后一個字符并將其放回原處:
perl -pe 's/([^0-9])\r?\n/$1/g'
uj5u.com熱心網友回復:
一種方法是使用\Klookbehind
perl -pe 's/[^0-9]\K\r?\n//g'
現在它會丟棄所有匹配項,\K因此只有后面的匹配項才受替換方的影響。
但是,我寧愿建議使用庫處理您的 CSV,即使它需要更多代碼。已經有一個問題,欄位內的換行,還有什么問題?一個好的圖書館可以處理各種違規行為。
Text::CSV的簡單示例
use warnings;
use strict;
use feature 'say';
use Text::CSV;
my $file = shift or die "Usage: $0 file.csv\n";
my $csv = Text::CSV->new({ binary => 1, auto_diag => 1 });
open my $fh, '<', $file or die "Can't open $file: $!";
while (my $row = $csv->getline($fh)) {
s/\n //g for @$row;
$csv->say(\*STDOUT, $row);
}
考慮其他建構式選項,也可以通過訪問器獲得,它們對各種意外問題都有好處。比如說allow_whitespace。
如果有原因,這也可以作為命令列程式(“單線”)來完成。然后通過csv的庫的功能介面很方便
perl -MText::CSV=csv -we'
csv in => *ARGV, on_in => sub { s/\n //g for @{$_[1]} }' filename
輸入來自命令列上*ARGV命名的檔案或來自.STDIN
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516894.html
標籤:正则表达式perl替代
上一篇:如何使用遞回更新
