Unix Shell CRLF 將會被替換為空格

Unix Shell CRLF 將會被替換為空格

我正在為 Oracle SQL Loader 使用以下輸入。我從服務下載的 CSV 檔案現在有一個 CRLF

我嘗試過

dos2unix 
tr '\n' ',' < input.txt > output.txt
awk '{printf "%s\r\n", $0}' file

但沒有運氣。

樣本資料 :

"ID","NAME","GROUP","Free Text [CR][LF]
[CR][LF]
[CR][LF]
[CR][LF]
"
"ID1","NAME1","GROUP1","Free Text1 [CR][LF]
"

期望的輸出:

"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"

請建議一個有幫助的程式碼或指令

先致謝

答案1

$ perl -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt
"ID","NAME","GROUP","Free Text"
"ID1","NAME1","GROUP1","Free Text1"

\r$這將以 CRLF (或)結尾的連續行連接\r\n成一長行,然後從該行中剝離所有 CRLF 對並列印它。

修改後的輸入將列印到 stdout,該輸出可以重定向到另一個檔案。或使用perl-i選項就地修改原始檔案:

$ perl -i.bak -pe 'while(m/\r$/) { $_ .= readline }; s/\r\n//g' rgram.txt

這將保持原來的rgram.txt.bak

我不喜歡使用-i,我寧願將標準輸出重定向到,例如rgram.new。寫入標準輸出更加通用(您可以將其傳輸到其他程序,或在進程或命令替換等中使用它),並且錯誤破壞原始檔案的風險較小。


rgram.txt是一個文字文件,包含問題中描述的範例資料:

$ sed -n l rgram.txt 
"ID","NAME","GROUP","Free Text\r$
\r$
\r$
\r$
"$
"ID1","NAME1","GROUP1","Free Text1\r$
"$

答案2

sed 's/"$//' rgram.csv | sed 's/$/"/' | sed '/^"$/d' > rgram.new.csv

我首先從文件中刪除了最後一個“字符,然後將其添加回來,然後刪除以”開頭的行。

答案3

我看到您想刪除 CRLF 序列,但保留 LF 而不單獨前面的 CR,所以:

perl -pe 's/\r\n//' < input.txt > output.txt

或者:

gawk -v RS='\r\n' -v ORS= 1 < input.txt > output.txt

相關內容